基于TCP的聊天程序

本文介绍了一个简单的聊天室系统的实现过程,包括服务器端和客户端的Java代码。该聊天室使用Socket进行通信,支持多用户连接并实时显示聊天信息。

服务器代码:

Code:
  1. packagecn.itcast.chat;
  2. importjava.awt.Frame;
  3. importjava.awt.TextArea;
  4. importjava.awt.event.WindowAdapter;
  5. importjava.awt.event.WindowEvent;
  6. importjava.io.BufferedReader;
  7. importjava.io.IOException;
  8. importjava.io.InputStreamReader;
  9. importjava.io.PrintWriter;
  10. importjava.net.ServerSocket;
  11. importjava.net.Socket;
  12. importjava.util.ArrayList;
  13. importjava.util.List;
  14. publicclassChatServer{
  15. privateFrameframe;
  16. privateTextAreainfoArea;
  17. privateList<Socket>list;
  18. publicChatServer(){
  19. list=newArrayList();
  20. init();
  21. }
  22. publicvoidinit(){
  23. frame=newFrame("聊天的服务端");
  24. frame.setBounds(300,200,400,400);
  25. infoArea=newTextArea();
  26. frame.add(infoArea);
  27. myEvent();
  28. frame.setVisible(true);
  29. }
  30. publicvoidmyEvent(){
  31. frame.addWindowListener(newWindowAdapter(){
  32. @Override
  33. publicvoidwindowClosing(WindowEvente){
  34. for(Sockets:list){
  35. try{
  36. s.shutdownOutput();
  37. }catch(IOExceptione1){
  38. System.out.println("servershutout");
  39. }
  40. }
  41. System.exit(0);
  42. }
  43. });
  44. }
  45. publicvoidconnection(){
  46. try{
  47. ServerSocketss=newServerSocket(30000);
  48. while(true){
  49. Socketsocket=ss.accept();
  50. Stringip=socket.getInetAddress().getHostAddress();
  51. list.add(socket);
  52. infoArea.append(ip+"已进入到聊天室/r/n");
  53. ServerThreadst=newServerThread(list,socket,infoArea);
  54. newThread(st).start();
  55. }
  56. }catch(IOExceptione){
  57. System.out.println("监听端口失败");
  58. }
  59. }
  60. publicstaticvoidmain(String[]args){
  61. newChatServer().connection();
  62. }
  63. }
  64. classServerThreadimplementsRunnable{
  65. privateSocketsocket;
  66. privateList<Socket>list;
  67. privateTextAreainfoArea;
  68. publicServerThread(List<Socket>list,Socketsocket,TextAreainfoArea){
  69. this.list=list;
  70. this.socket=socket;
  71. this.infoArea=infoArea;
  72. }
  73. @Override
  74. publicvoidrun(){
  75. try{
  76. Stringip=socket.getInetAddress().getHostAddress();
  77. BufferedReaderbufr=
  78. newBufferedReader(newInputStreamReader(socket.getInputStream()));
  79. Stringline=null;
  80. while((line=bufr.readLine())!=null){
  81. for(Sockets:list){
  82. PrintWriterout=newPrintWriter(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(IOExceptione){
  92. System.out.println("serverthreadexception"+e.toString());
  93. }
  94. }
  95. }

客户端代码:

Code:
  1. packagecn.itcast.chat;
  2. importjava.awt.Button;
  3. importjava.awt.Color;
  4. importjava.awt.FlowLayout;
  5. importjava.awt.Frame;
  6. importjava.awt.TextArea;
  7. importjava.awt.event.ActionEvent;
  8. importjava.awt.event.ActionListener;
  9. importjava.awt.event.WindowAdapter;
  10. importjava.awt.event.WindowEvent;
  11. importjava.io.BufferedReader;
  12. importjava.io.IOException;
  13. importjava.io.InputStreamReader;
  14. importjava.io.PrintWriter;
  15. importjava.net.Socket;
  16. importjava.net.UnknownHostException;
  17. publicclassChatClient{
  18. privateFrameframe;
  19. privateTextAreareceArea,sendArea;
  20. privateButtonsendBut;
  21. privateSocketsocket;
  22. publicChatClient(){
  23. init();
  24. }
  25. publicvoidinit(){
  26. frame=newFrame("聊天的客户端");
  27. frame.setBounds(300,200,500,420);
  28. frame.setLayout(newFlowLayout(FlowLayout.RIGHT));
  29. receArea=newTextArea(14,65);
  30. receArea.setEditable(false);
  31. receArea.setBackground(Color.white);
  32. sendArea=newTextArea(6,65);
  33. sendBut=newButton("发送");
  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. publicvoidmyEvent(){
  44. sendBut.addActionListener(newActionListener(){
  45. @Override
  46. publicvoidactionPerformed(ActionEvente){
  47. if(socket!=null&&socket.isClosed()){
  48. receArea.append("通讯中断");
  49. sendBut.setEnabled(false);
  50. return;
  51. }
  52. Stringtext=sendArea.getText();
  53. try{
  54. PrintWriterout=newPrintWriter(socket.getOutputStream(),true);
  55. out.println(text);
  56. }catch(IOExceptione1){
  57. }
  58. sendArea.setText("");
  59. }
  60. });
  61. frame.addWindowListener(newWindowAdapter(){
  62. @Override
  63. publicvoidwindowOpened(WindowEvente){
  64. sendArea.requestFocus();
  65. }
  66. @Override
  67. publicvoidwindowClosing(WindowEvente){
  68. if(socket!=null){
  69. try{
  70. socket.shutdownOutput();
  71. }catch(IOExceptione1){
  72. System.out.println("shutout");
  73. }
  74. }
  75. System.exit(0);
  76. }
  77. });
  78. }
  79. publicvoidinitConnection(){
  80. try{
  81. socket=newSocket("192.168.1.254",30000);
  82. }catch(UnknownHostExceptione){
  83. receArea.append("未知主机");return;
  84. }catch(IOExceptione){
  85. receArea.append("网络服务失败");return;
  86. }
  87. sendBut.setEnabled(true);
  88. ClientThreadct=newClientThread(socket,receArea);
  89. newThread(ct).start();
  90. }
  91. publicstaticvoidmain(String[]args){
  92. newChatClient();
  93. }
  94. }
  95. classClientThreadimplementsRunnable{
  96. privateSocketsocket;
  97. privateTextAreareceArea;
  98. ClientThread(Socketsocket,TextAreareceArea){
  99. this.socket=socket;
  100. this.receArea=receArea;
  101. }
  102. @Override
  103. publicvoidrun(){
  104. BufferedReaderbufr=null;
  105. try{
  106. bufr=
  107. newBufferedReader(newInputStreamReader(socket.getInputStream()));
  108. Stringline=null;
  109. while((line=bufr.readLine())!=null){
  110. receArea.append(line+"/r/n");
  111. }
  112. if(socket!=null){
  113. socket.close();
  114. }
  115. }catch(IOExceptione){
  116. System.out.println("clientthreadexception"+e.toString());
  117. }
  118. }
  119. }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值