標籤:
一、概述
1.目標:建立基於tcp協議的聊天系統
2.思路:用java socket編程
二、代碼
1.ChatServer.java
import java.io.DataInputStream;import java.io.EOFException;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.net.UnknownHostException;public class ChatServer{public static void main(String[] args) {DataInputStream dis = null;Socket s = null;ServerSocket ss = null;boolean started =false;try {ss = new ServerSocket(8888);} catch (IOException e1) {e1.printStackTrace();}try {started = true;while(started){boolean bConnect = false;//!!!!!注意accept()是阻塞性方法,當被readUTF()阻塞時它不會被執行s = ss.accept();System.out.println("a client connect------"+s);dis = new DataInputStream(s.getInputStream());bConnect = true;while(bConnect){//!!!!!注意readUTF()是阻塞性方法System.out.println(dis.readUTF());}}} catch (EOFException e) {System.out.println("用戶端已關閉!");} catch (IOException e) {e.printStackTrace();}finally{try {if(dis != null ) dis.close();if(s != null ) s.close();if(ss != null ) ss.close();} catch (Exception e) {e.printStackTrace();}}}}
2.Chatclient.java
import java.awt.BorderLayout;import java.awt.Button;import java.awt.Frame;import java.awt.TextArea;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.DataOutputStream;import java.io.IOException;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;public class ChatClient extends Frame{private TextField tfText;private TextArea taContent;//private Button btnSend;private Socket socket;private DataOutputStream dos;public void launchFrame(){addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { disconnect(); System.exit(0); }});tfText = new TextField();taContent = new TextArea();//btnSend = new Button("發送");////btnSend.addActionListener(new ActionListener() {//@Override//public void actionPerformed(ActionEvent e) {////taContent.setText(taContent.getText()+"\n\r"+tfText.getText());////tfText.setText("");//try {//DataOutputStream dos = new DataOutputStream(socket.getOutputStream());//dos.writeUTF(tfText.getText());//dos.close();//socket.close();//} catch (IOException e1) {//e1.printStackTrace();//}//}//});tfText.addActionListener(new TFListener());add(taContent,BorderLayout.NORTH);add(tfText,BorderLayout.CENTER);//add(btnSend,BorderLayout.SOUTH);setLocation(300, 100);pack();setVisible(true);connect("localhost", 8888);}//當調用了此方法,會自動把成員變數給socket串連上serverpublic void connect(String address, int port){try {socket = new Socket(address, port);dos = new DataOutputStream(socket.getOutputStream());} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//退出時釋放資源public void disconnect(){try {if(dos != null ) dos.close();if(socket != null ) socket.close();} catch (IOException e) {e.printStackTrace();}}class TFListener implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {taContent.setText(taContent.getText().trim()+"\n\r"+tfText.getText());try {dos.writeUTF(tfText.getText());dos.flush();tfText.setText("");//dos.close();//socket.close();} catch (IOException e1) {e1.printStackTrace();}}}public static void main(String[] args) {new ChatClient().launchFrame();}}
三、運行結果
Java-線上聊天系統-非線程