1. 程式人生 > >JavaSE基礎小結--1---基於TCP的聊天程式

JavaSE基礎小結--1---基於TCP的聊天程式

伺服器程式碼:

Code:
  1. package cn.itcast.chat;    
  2. import java.awt.Frame;    
  3. import java.awt.TextArea;    
  4. import java.awt.event.WindowAdapter;    
  5. import java.awt.event.WindowEvent;    
  6. import java.io.BufferedReader;    
  7. import java.io.IOException;    
  8. import java.io.InputStreamReader;    
  9. import java.io.PrintWriter;    
  10. import java.net.ServerSocket;    
  11. import java.net.Socket;    
  12. import java.util.ArrayList;    
  13. import java.util.List;    
  14. publicclass ChatServer {    
  15. private Frame frame;    
  16. private TextArea infoArea;    
  17. private List<Socket> list;    
  18. public ChatServer() {    
  19.                 list = new ArrayList();    
  20.                 init();    
  21.         }    
  22. publicvoid init() {    
  23.                 frame = new Frame("聊天的服務端");    
  24.                 frame.setBounds(300200400400);    
  25.                 infoArea = new TextArea();    
  26.                 frame.add(infoArea);    
  27.                 myEvent();    
  28.                 frame.setVisible(
    true);    
  29.         }    
  30. publicvoid myEvent() {    
  31.                 frame.addWindowListener(new WindowAdapter() {    
  32. @Override
  33. publicvoid windowClosing(WindowEvent e) {    
  34. for(Socket s : list){    
  35. try {    
  36.                                                 s.shutdownOutput();    
  37.                                         } catch (IOException e1) {    
  38.                                                 System.out.println("server shut out ");    
  39.                                         }    
  40.                                 }    
  41.                                 System.exit(0);    
  42.                         }    
  43.                 });    
  44.         }    
  45. publicvoid connection(){    
  46. try {    
  47.                         ServerSocket ss = new ServerSocket(30000);    
  48. while(true){    
  49.                                 Socket socket = ss.accept();    
  50.                                 String ip = socket.getInetAddress().getHostAddress();    
  51.                                 list.add(socket);    
  52.                                 infoArea.append(ip+"已進入到聊天室/r/n");    
  53.                                 ServerThread st = new ServerThread(list,socket,infoArea);    
  54. new Thread(st).start();    
  55.                         }    
  56.                 } catch (IOException e) {    
  57.                         System.out.println("監聽埠失敗");    
  58.                 }    
  59.         }    
  60. publicstaticvoid main(String[] args) {    
  61. new ChatServer().connection();    
  62.         }    
  63. }    
  64. class ServerThread implements Runnable{    
  65. private Socket socket;    
  66. private List<Socket> list;    
  67. private TextArea infoArea;    
  68. public ServerThread(List<Socket> list,Socket socket,TextArea infoArea) {    
  69. this.list = list;    
  70. this.socket = socket;    
  71. this.infoArea = infoArea;    
  72.         }    
  73. @Override
  74. publicvoid run() {    
  75. try {    
  76.                         String ip = socket.getInetAddress().getHostAddress();    
  77.                         BufferedReader bufr =     
  78. new BufferedReader(new InputStreamReader(socket.getInputStream()));    
  79.                         String line = null;    
  80. while((line=bufr.readLine())!=null){    
  81. for(Socket s : list){    
  82.                                         PrintWriter out = new PrintWriter(s.getOutputStream(),true);    
  83.                                         out.println(ip+":"+line);    
  84.                                 }    
  85.                         }    
  86. if(socket!=null){    
  87.                                 socket.close();    
  88.                                 infoArea.append(ip+"已離開聊天室!!!!!!/r/n");    
  89.                                 list.remove(socket);    
  90.                         }    
  91.                 } catch (IOException e) {    
  92.                         System.out.println("server thread exception "+e.toString());    
  93.                 }    
  94.         }    
  95. }   

客戶端程式碼:

Code:
  1. package cn.itcast.chat;    
  2. import java.awt.Button;    
  3. import java.awt.Color;    
  4. import java.awt.FlowLayout;    
  5. import java.awt.Frame;    
  6. import java.awt.TextArea;    
  7. import java.awt.event.ActionEvent;    
  8. import java.awt.event.ActionListener;    
  9. import java.awt.event.WindowAdapter;    
  10. import java.awt.event.WindowEvent;    
  11. import java.io.BufferedReader;    
  12. import java.io.IOException;    
  13. import java.io.InputStreamReader;    
  14. import java.io.PrintWriter;    
  15. import java.net.Socket;    
  16. import java.net.UnknownHostException;    
  17. publicclass ChatClient {    
  18. private Frame frame;    
  19. private TextArea receArea,sendArea;    
  20. private Button sendBut;    
  21. private Socket socket;    
  22. public ChatClient(){    
  23.                 init();    
  24.         }    
  25. publicvoid init(){    
  26.                 frame = new Frame("聊天的客戶端");    
  27.                 frame.setBounds(300200500420);    
  28.                 frame.setLayout(new FlowLayout(FlowLayout.RIGHT));    
  29.                 receArea = new TextArea(14,65);    
  30.                 receArea.setEditable(false);    
  31.                 receArea.setBackground(Color.white);    
  32.                 sendArea = new TextArea(6,65);    
  33.                 sendBut = new Button("發  送");    
  34.                 sendBut.setEnabled(false);    
  35.                 frame.add(receArea);    
  36.                 frame.add(sendArea);    
  37.                 frame.add(sendBut);    
  38.                 myEvent();    
  39.                 frame.setResizable(false);    
  40.                 frame.setVisible(true);    
  41.                 initConnection();    
  42.         }    
  43. publicvoid myEvent(){    
  44.                 sendBut.addActionListener(new ActionListener() {    
  45. @Override
  46. publicvoid actionPerformed(ActionEvent e) {    
  47. if(socket!=null && socket.isClosed()){    
  48.                                         receArea.append("通訊中斷");    
  49.                                         sendBut.setEnabled(false);    
  50. return;    
  51.                                 }    
  52.                                 String text = sendArea.getText();    
  53. try {    
  54.                                         PrintWriter out = new PrintWriter(socket.getOutputStream(),true);    
  55.                                         out.println(text);    
  56.                                 } catch (IOException e1) {    
  57.                                 }    
  58.                                 sendArea.setText("");    
  59.                         }    
  60.                 });    
  61.                 frame.addWindowListener(new WindowAdapter() {    
  62. @Override
  63. publicvoid windowOpened(WindowEvent e) {    
  64.                                 sendArea.requestFocus();    
  65.                         }    
  66. @Override
  67. publicvoid windowClosing(WindowEvent e) {    
  68. if(socket!=null){    
  69. try {    
  70.                                                 socket.shutdownOutput();    
  71.                                         } catch (IOException e1) {    
  72.                                                 System.out.println("shut out");    
  73.                                         }    
  74.                                 }    
  75.                                 System.exit(0);    
  76.                         }    
  77.                 });    
  78.         }    
  79. publicvoid initConnection(){    
  80. try {    
  81.                         socket = new Socket("192.168.1.254",30000);    
  82.                 } catch (UnknownHostException e) {    
  83.                         receArea.append("未知主機");return;    
  84.                 } catch (IOException e) {    
  85.                         receArea.append("網路服務失敗");return;    
  86.                 }    
  87.                 sendBut.setEnabled(true);    
  88.                 ClientThread ct =new ClientThread(socket, receArea);    
  89. new Thread(ct).start();    
  90.         }    
  91. publicstaticvoid main(String[] args) {    
  92. new ChatClient();    
  93.         }    
  94. }    
  95. class ClientThread implements Runnable{    
  96. private Socket socket;    
  97. private TextArea receArea;    
  98.         ClientThread(Socket socket,TextArea receArea){    
  99. this.socket = socket;    
  100. this.receArea = receArea;    
  101.         }    
  102. @Override
  103. publicvoid run() {    
  104.                 BufferedReader bufr = null;    
  105. try {    
  106.                         bufr =     
  107. new BufferedReader(new InputStreamReader(socket.getInputStream()));    
  108.                         String line = null;    
  109. while((line=bufr.readLine())!=null){    
  110.                                 receArea.append(line+"/r/n");    
  111.                         }    
  112. if(socket!=null){    
  113.                                 socket.close();    
  114.                         }    
  115.                 } catch (IOException e) {    
  116.                         System.out.println("client thread exception"+e.toString());    
  117.                 }    
  118.         }    
  119. }