/**
* Created by JXJ on 2017/6/26.
*/
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Client extends JFrame {
private JTextField userText;
private JTextArea chatwindow;
private ObjectInputStream input;
private ObjectOutputStream output;
private String message= "" ;
private String serverIP;
private Socket connection;
//構造方法
public Client(String host){
super ( "客戶端" );
serverIP=host;
userText= new JTextField();
userText.setEditable( false );
userText.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sendMessage(e.getActionCommand());
userText.setText( "" );
}
});
add(userText,BorderLayout.NORTH);
chatwindow= new JTextArea();
add( new JScrollPane(chatwindow),BorderLayout.CENTER);
setSize( 300 , 150 );
setVisible( true );
}
//建立連接
public void startRununing(){
try {
connectToServer();
setupStreams();
whileChatting();
} catch (EOFException eofException){
showMessage( "客戶端斷開連接! \n" );
} catch (IOException ioExceptiopn){
ioExceptiopn.printStackTrace();
}
finally {
closeCrap();
}
}
//連接到服務端
private void connectToServer() throws IOException {
showMessage( "正在嘗試連接服務端... \n" );
connection= new Socket(InetAddress.getByName(serverIP), 6789 );
showMessage( "已連接至" +connection.getInetAddress().getHostName());
}
//建立輸入輸出流
private void setupStreams() throws IOException {
output= new ObjectOutputStream(connection.getOutputStream());
output.flush();
input= new ObjectInputStream(connection.getInputStream());
showMessage( "已創建輸入輸出流... \n" );
}
//聊天信息處理
private void whileChatting() throws IOException {
ableToType( true );
do {
try {
message=(String)input.readObject();
showMessage(message+ "\n" );
} catch (ClassNotFoundException classNotFoundException){
showMessage( " 未知的輸入對象類型\n" );
}
} while (!message.equals( "server-end" ));
}
//關閉輸入輸出流和socket
private void closeCrap() {
showMessage( "關閉客戶端連接資源\n" );
ableToType( false );
try {
output.close();
input.close();
connection.close();
} catch (IOException ioException){
ioException.printStackTrace();
}
}
//給服務端發送信息
private void sendMessage(String message) {
try {
output.writeObject( "client-" +message);
output.flush();
showMessage( "client-" +message+ "\n" );
} catch (IOException ioException){
showMessage( "客戶端發送數據失敗\n" );
}
}
//在窗口上實時顯示聊天信息
private void showMessage( final String text) {
//注意窗口更新信息的方式
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
chatwindow.append(text);
}
});
}
//讓用戶輸入信息
private void ableToType( final boolean tof) {
//注意按鈕的禁用與啓用的方式
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
userText.setEditable(tof);
}
});
}
}
|