现在的位置: 首页 > 综合 > 正文

JAVA小程序——-在线聊天系统

2012年04月16日 ⁄ 综合 ⁄ 共 4076字 ⁄ 字号 评论关闭
  1 

//服务器部分
import java.io.DataInputStream; 2 import java.io.DataOutputStream; 3 import java.io.EOFException; 4 import java.io.IOException; 5 import java.net.BindException; 6 import java.net.ServerSocket; 7 import java.net.Socket; 8 import java.util.ArrayList; 9 import java.util.List; 10 11 public class ChatServer { 12 13 public static boolean isRun = false; 14 15 ServerSocket serverSocket = null; 16 17 List<ServerThread>st = new ArrayList<>(); 18 19 public static void main(String[] args) { 20 new ChatServer().start(); 21 } 22 23 public void start() { 24 25 try { 26 serverSocket = new ServerSocket(8888); 27 isRun = true; 28 } catch (BindException e) { 29 System.out.println("端口使用中"); 30 System.exit(0); 31 } catch (IOException e) { 32 e.printStackTrace(); 33 } 34 35 try { 36 37 while (isRun) { 38 39 Socket socket = serverSocket.accept(); 40 ServerThread serverThread = new ServerThread(socket); 41 new Thread(serverThread).start(); 42 st.add(serverThread); 43 // dis.close(); 44 } 45 } catch (IOException e) { 46 e.printStackTrace(); 47 } finally { 48 try { 49 serverSocket.close(); 50 } catch (IOException e) { 51 e.printStackTrace(); 52 } 53 } 54 } 55 56 class ServerThread implements Runnable { 57 58 private Socket s; 59 private DataInputStream dis = null; 60 private DataOutputStream dos = null; 61 private boolean bConnected = false; 62 63 public ServerThread(Socket s) { 64 super(); 65 this.s = s; 66 try { 67 dis = new DataInputStream(s.getInputStream()); 68 dos = new DataOutputStream(s.getOutputStream()); 69 bConnected = true; 70 } catch (IOException e) { 71 e.printStackTrace(); 72 } 73 74 } 75 76 77 public void send(String str){ 78 try { 79 dos.writeUTF(str); 80 } catch (IOException e) { 81 st.remove(this); 82 83 } 84 } 85 86 @Override 87 public void run() { 88 89 try { 90 while (bConnected) { 91 String str = dis.readUTF(); 92 System.out.println(str); 93 for(int i = 0 ; i < st.size() ; i ++){ 94 ServerThread serverThread1 = st.get(i); 95 serverThread1.send(str); 96 } 97 } 98 }catch (EOFException e) { 99 System.out.println("client closed"); 100 } catch (IOException e) { 101 e.printStackTrace(); 102 }finally { 103 try { 104 if (s != null){ 105 s.close(); 106 s = null; 107 } 108 if (dis != null) 109 dis.close(); 110 if(dos != null) 111 dos.close(); 112 } catch (IOException e1) { 113 e1.printStackTrace(); 114 } 115 116 117 118 } 119 120 } 121 122 } 123 124 }

//客户端部分
import
java.awt.BorderLayout; 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.WindowAdapter; import java.awt.event.WindowEvent; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.EOFException; import java.io.IOException; import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException; public class ChatClient extends Frame { DataOutputStream dos = null; Socket socket; TextField inputChat = new TextField(); TextArea showChat = new TextArea(); DataInputStream dis = null; private static boolean isRun = false; Thread tRecv = new Thread(new ClientThread()); public static void main(String[] args) { new ChatClient().launchFrame(); } public void launchFrame() { setLocation(400, 300); setSize(300, 300); add(inputChat, BorderLayout.SOUTH); add(showChat, BorderLayout.NORTH); pack(); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { disconnect(); System.exit(0); } }); inputChat.addActionListener(new TextFieldListener()); setVisible(true); connectToServer(); tRecv.start(); } private void connectToServer() { try { socket = new Socket("127.0.0.1", 8888); dos = new DataOutputStream(socket.getOutputStream()); dis = new DataInputStream(socket.getInputStream()); isRun = true; } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void disconnect() { try { dos.close(); dis.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } //关闭各种流之前必须先关闭接受线程 } private class ClientThread implements Runnable{ @Override public void run() { try { while(isRun){ String str = dis.readUTF(); System.out.println(str); showChat.setText(showChat.getText() + str +'\n'); } }catch (SocketException e) { System.out.println("bye"); }catch (EOFException e) { }catch (IOException e) { e.printStackTrace(); } } } private class TextFieldListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { String s = inputChat.getText().trim(); // showChat.setText(s); inputChat.setText(""); try { dos.writeUTF(s); dos.flush(); // dos.close(); } catch (IOException e1) { e1.printStackTrace(); } } } }

抱歉!评论已关闭.