[转]Java写的聊天程序
客户端:
package zju.lh; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; @SuppressWarnings("serial") public class ChatClient extends Frame{ Socket s = null; DataInputStream dis = null; DataOutputStream dos = null; boolean connected = false; String name; Thread rt = null; TextField tfTxt = new TextField(); TextArea taContent = new TextArea(); //Button buttonSend = new Button("发送"); public static void main(String[] args){ new ChatClient("dd").lauchFrame(); } public ChatClient(String name){ this.name = name; } public void lauchFrame(){ this.setLocation(400, 300); this.setSize(500, 400); this.setTitle(name); this.add(tfTxt, BorderLayout.SOUTH); this.add(taContent, BorderLayout.NORTH); this.tfTxt.addActionListener(new TFListener()); //this.add(buttonSend, BorderLayout.AFTER_LINE_ENDS); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent arg0){ close(); System.exit(0); } }); this.pack(); this.setVisible(true); connect(); rt = new Thread(new ReceiveThread()); rt.start(); } public void connect(){ try{ s = new Socket("127.0.0.1", 8888); dos = new DataOutputStream(s.getOutputStream()); dis = new DataInputStream(s.getInputStream()); connected = true; }catch(UnknownHostException ex){ ex.printStackTrace(); } catch(IOException ex){ ex.printStackTrace(); } } @SuppressWarnings("deprecation") public void close(){ try{ if(dis != null) dis.close(); if(dos != null) dos.close(); }catch(Exception ex){ ex.printStackTrace(); }finally{ Thread.yield(); rt.stop(); System.out.println("退出了. . . . . ."); } } public void sendMsg(String msg){ try{ dos.writeUTF(msg); dos.flush(); }catch(IOException e){ e.printStackTrace(); } } private class TFListener implements ActionListener{ public void actionPerformed(ActionEvent e){ String msg = name + " : " + tfTxt.getText().trim() + "\n"; taContent.append(msg); tfTxt.setText(""); sendMsg(msg); } } private class ReceiveThread implements Runnable { private void receive(){ String msg = ""; try{ msg = dis.readUTF(); taContent.append(msg); }catch(IOException e){ } } public void run(){ while(connected){ receive(); } } } }
服务器端:
package zju.lh; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.*; import java.util.Vector; public class ChatServer { boolean started = false; ServerSocket ss = null; public static Vector<ClientThread> cts = new Vector<ClientThread>(); public static void main(String[] args){ new ChatServer().start(); } public void start(){ try{ ss = new ServerSocket(8888); started = true; System.err.println("/*********服务器已经启动在8888端口监听************/"); }catch(Exception ex){ System.err.print("出错"); ex.printStackTrace(); System.exit(0); } try{ while(started){ Socket s = ss.accept(); ClientThread ct = new ClientThread(s); new Thread(ct).start(); cts.add(ct); } }catch(Exception ex){ ex.printStackTrace(); }finally{ try{ if(ss != null) ss.close(); }catch(IOException e){ e.printStackTrace(); } } } private class ClientThread implements Runnable{ private Socket s; private DataInputStream dis; private DataOutputStream dos; private boolean connected = false; private Vector<ClientThread> threads = cts; public ClientThread(Socket s){ this.s = s; try{ this.dis = new DataInputStream(s.getInputStream()); this.dos = new DataOutputStream(s.getOutputStream()); this.connected = true; }catch(IOException ex){ ex.printStackTrace(); } } public void transmit(String msg){ try{ dos.writeUTF(msg); dos.flush(); }catch(IOException e){ e.printStackTrace(); } } @Override public void run(){ try{ while(connected){ String msg = dis.readUTF(); for(ClientThread ct : threads){ if(ct != this) ct.transmit(msg); } } }catch(Exception ex){ }finally{ try{ if(dos != null) dos.close(); if(dis != null) dis.close(); if(s != null){ s.close(); //移除这个客户端的连接 cts.remove(this); } }catch(IOException e){ e.printStackTrace(); } } } } }