`

java socket/swing聊天系统

 
阅读更多
上个周五的下午,在公司闲来无事,
写了个小程序玩玩,
稍微测试了一下,居然能用!
但由于代码量较少,也谈不上什么设计,
发上来算是个备忘吧:
服务器端程序:
  1. packagecom.test.talk;
  2. importjava.awt.BorderLayout;
  3. importjava.awt.FlowLayout;
  4. importjava.awt.event.ActionEvent;
  5. importjava.awt.event.ActionListener;
  6. importjava.awt.event.WindowAdapter;
  7. importjava.awt.event.WindowEvent;
  8. importjava.io.DataInputStream;
  9. importjava.io.DataOutputStream;
  10. importjava.io.IOException;
  11. importjava.net.BindException;
  12. importjava.net.ServerSocket;
  13. importjava.net.Socket;
  14. importjava.util.LinkedList;
  15. importjava.util.List;
  16. importjavax.swing.JButton;
  17. importjavax.swing.JFrame;
  18. importjavax.swing.JLabel;
  19. importjavax.swing.JPanel;
  20. importjavax.swing.JTextField;
  21. publicclassServerextendsJFrame
  22. {
  23. booleanstarted=false;
  24. privateServerSocketss=null;
  25. privateListclientList=newLinkedList();
  26. privateJLabelportLbl=null;
  27. privateJTextFieldportTxt=null;
  28. privateJButtonportSetBtn=null;
  29. privateStringport=null;
  30. privateJButtonstartBtn=null;
  31. privateJButtonstopBtn=null;
  32. privateJPanelmainPanle=null;
  33. privateJPanelheadPanle=null;
  34. publicstaticvoidmain(String[]args)
  35. {
  36. newServer();
  37. }
  38. publicServer()
  39. {
  40. headPanle=newJPanel(newFlowLayout(FlowLayout.LEFT));
  41. portLbl=newJLabel("PORT");
  42. portTxt=newJTextField(7);
  43. portSetBtn=newJButton("OK");
  44. portSetBtn.addActionListener(newActionListener()
  45. {
  46. publicvoidactionPerformed(ActionEvente)
  47. {
  48. if(portTxt.getText().matches("//d+"))
  49. {
  50. port=portTxt.getText();
  51. startBtn.setEnabled(true);
  52. stopBtn.setEnabled(true);
  53. }
  54. else
  55. {
  56. javax.swing.JOptionPane.showMessageDialog(null,"portbeinputtedisillegal");
  57. }
  58. }
  59. });
  60. headPanle.add(portLbl);
  61. headPanle.add(portTxt);
  62. headPanle.add(portSetBtn);
  63. getContentPane().add(headPanle,BorderLayout.NORTH);
  64. startBtn=newJButton("Start");
  65. stopBtn=newJButton("Stop");
  66. startBtn.setEnabled(false);
  67. stopBtn.setEnabled(false);
  68. mainPanle=newJPanel(newFlowLayout(FlowLayout.CENTER));
  69. startBtn.addActionListener(newStartClickListener());
  70. stopBtn.addActionListener(newActionListener()
  71. {
  72. publicvoidactionPerformed(ActionEvente)
  73. {
  74. started=false;
  75. clientList.clear();
  76. try
  77. {
  78. if(ss!=null)
  79. {
  80. ss.close();
  81. }
  82. }
  83. catch(IOExceptione1)
  84. {
  85. e1.printStackTrace();
  86. }
  87. }
  88. });
  89. mainPanle.add(startBtn);
  90. mainPanle.add(stopBtn);
  91. getContentPane().add(mainPanle,BorderLayout.CENTER);
  92. addWindowListener(newWindowAdapter()
  93. {
  94. publicvoidwindowClosing(WindowEvente)
  95. {
  96. started=false;
  97. clientList.clear();
  98. try
  99. {
  100. if(ss!=null)
  101. {
  102. ss.close();
  103. }
  104. }
  105. catch(IOExceptione1)
  106. {
  107. e1.printStackTrace();
  108. }
  109. System.exit(0);
  110. }
  111. });
  112. this.setSize(300,300);
  113. setLocation(100,100);
  114. pack();
  115. setVisible(true);
  116. }
  117. privatevoidstart()
  118. {
  119. try
  120. {
  121. ss=newServerSocket(Integer.parseInt(port));
  122. started=true;
  123. }
  124. catch(BindExceptionbe)
  125. {
  126. javax.swing.JOptionPane.showMessageDialog(null,"portisuseingbyothers");
  127. }
  128. catch(IOExceptione)
  129. {
  130. javax.swing.JOptionPane.showMessageDialog(null,"connectserverfail");
  131. }
  132. try
  133. {
  134. while(started)
  135. {
  136. Sockets=ss.accept();
  137. ClientImplcr=newClientImpl(s);
  138. newThread(cr).start();
  139. clientList.add(cr);
  140. System.out.println("SystemInfo:"+s.getInetAddress()+"connectsuccessfully");
  141. }
  142. }
  143. catch(IOExceptione)
  144. {
  145. System.out.println("Clientclosed!");
  146. }
  147. }
  148. classClientImplimplementsRunnable
  149. {
  150. privateSockets;
  151. privateDataInputStreamdis=null;
  152. privateDataOutputStreamdos=null;
  153. booleanbConnect=false;
  154. publicClientImpl(Sockets)
  155. {
  156. this.s=s;
  157. try
  158. {
  159. dis=newDataInputStream(s.getInputStream());
  160. dos=newDataOutputStream(s.getOutputStream());
  161. bConnect=true;
  162. }
  163. catch(IOExceptione)
  164. {
  165. e.printStackTrace();
  166. }
  167. }
  168. privatevoidsend(Stringstr)
  169. {
  170. try
  171. {
  172. dos.writeUTF(str);
  173. }
  174. catch(IOExceptione)
  175. {
  176. e.printStackTrace();
  177. }
  178. }
  179. publicvoidrun()
  180. {
  181. ClientImplcr=null;
  182. try
  183. {
  184. while(bConnect)
  185. {
  186. Stringstr=dis.readUTF();
  187. System.out.println(str);
  188. for(inti=0;i<clientList.size();i++)
  189. {
  190. cr=(ClientImpl)clientList.get(i);
  191. cr.send(str);
  192. }
  193. }
  194. }
  195. catch(Exceptione)
  196. {
  197. clientList.remove(cr);
  198. System.out.println(s.getInetAddress()+"hasleaved");
  199. }
  200. finally
  201. {
  202. try
  203. {
  204. if(dis!=null)
  205. dis.close();
  206. if(dos!=null)
  207. dos.close();
  208. if(s!=null)
  209. {
  210. s.close();
  211. s=null;
  212. }
  213. }
  214. catch(IOExceptionio)
  215. {
  216. io.printStackTrace();
  217. }
  218. }
  219. }
  220. }
  221. classStartClickListenerimplementsRunnable,ActionListener
  222. {
  223. publicvoidactionPerformed(ActionEvente)
  224. {
  225. newThread(this).start();
  226. }
  227. publicvoidrun()
  228. {
  229. start();
  230. }
  231. }
  232. }
客户端程序:
  1. packagecom.test.talk;
  2. importjava.awt.BorderLayout;
  3. importjava.awt.FlowLayout;
  4. importjava.awt.event.ActionEvent;
  5. importjava.awt.event.ActionListener;
  6. importjava.awt.event.WindowAdapter;
  7. importjava.awt.event.WindowEvent;
  8. importjava.io.DataInputStream;
  9. importjava.io.DataOutputStream;
  10. importjava.io.IOException;
  11. importjava.net.Socket;
  12. importjava.net.UnknownHostException;
  13. importjavax.swing.JButton;
  14. importjavax.swing.JFrame;
  15. importjavax.swing.JLabel;
  16. importjavax.swing.JPanel;
  17. importjavax.swing.JTextArea;
  18. importjavax.swing.JTextField;
  19. /**
  20. *Client
  21. *
  22. *@authorhx0272
  23. *
  24. */
  25. publicclassClient
  26. {
  27. publicstaticvoidmain(String[]args)
  28. {
  29. ClientFrameframe=newClientFrame();
  30. }
  31. }
  32. classClientFrameextendsJFrame
  33. {
  34. privateJPanelmainPanel;
  35. privateJPanelheadPanel;
  36. privateJPanelfootPanel;
  37. privateJTextAreashowArea;
  38. privateJTextFieldinputTxt;
  39. privateJLabelportLbl;
  40. privateJLabelipLbl;
  41. privateJLabelnameLbl;
  42. privateJTextFieldportTxt;
  43. privateJTextFieldipTxt;
  44. privateJTextFieldnameTxt;
  45. privateJButtonsubmitBtn;
  46. privateJButtonnameBtn;
  47. privateJButtonloginBtn;
  48. privateSocketclientSocket=null;
  49. privateDataOutputStreamdos=null;
  50. privateDataInputStreamdis=null;
  51. privatebooleanbConnect=false;
  52. privateStringname="";
  53. publicClientFrame()
  54. {
  55. init();
  56. }
  57. privatevoidinit()
  58. {
  59. //mainpanelBegin
  60. mainPanel=newJPanel();
  61. showArea=newJTextArea(15,80);
  62. showArea.setEditable(false);
  63. mainPanel.add(showArea);
  64. getContentPane().add(mainPanel,BorderLayout.CENTER);
  65. //mainpanelEnd
  66. //headpanelBegin
  67. headPanel=newJPanel(newFlowLayout(FlowLayout.LEFT));
  68. portLbl=newJLabel("PORT");
  69. portTxt=newJTextField(7);
  70. ipLbl=newJLabel("IP");
  71. ipTxt=newJTextField(25);
  72. nameLbl=newJLabel("name");
  73. nameTxt=newJTextField(15);
  74. nameBtn=newJButton("OK");
  75. loginBtn=newJButton("login");
  76. nameBtn.addActionListener(newActionListener()
  77. {
  78. publicvoidactionPerformed(ActionEvente)
  79. {
  80. Stringtmp=nameTxt.getText();
  81. if(tmp!=null||!tmp.equals(""))
  82. {
  83. intid=javax.swing.JOptionPane.showConfirmDialog(null,"yesorno","chooseyes",
  84. javax.swing.JOptionPane.OK_OPTION);
  85. if(id==0)
  86. {
  87. name=nameTxt.getText();
  88. loginBtn.setEnabled(true);
  89. nameBtn.setEnabled(false);
  90. }
  91. }
  92. }
  93. });
  94. headPanel.add(portLbl);
  95. headPanel.add(portTxt);
  96. headPanel.add(ipLbl);
  97. headPanel.add(ipTxt);
  98. headPanel.add(loginBtn);
  99. headPanel.add(nameLbl);
  100. headPanel.add(nameTxt);
  101. headPanel.add(nameBtn);
  102. loginBtn.setEnabled(false);
  103. loginBtn.addActionListener(newButtonClickAction());
  104. getContentPane().add(headPanel,BorderLayout.NORTH);
  105. //headpanelEnd
  106. //footpanelBegin
  107. footPanel=newJPanel(newFlowLayout(FlowLayout.LEFT));
  108. inputTxt=newJTextField(70);
  109. submitBtn=newJButton("submit");
  110. footPanel.add(inputTxt);
  111. footPanel.add(submitBtn);
  112. submitBtn.addActionListener(newButtonClickAction());
  113. submitBtn.setEnabled(false);
  114. getContentPane().add(footPanel,BorderLayout.SOUTH);
  115. //footpanelEnd
  116. addWindowListener(newWindowAdapter()
  117. {
  118. publicvoidwindowClosing(WindowEvente)
  119. {
  120. disConnect();
  121. System.exit(0);
  122. }
  123. });
  124. this.setSize(300,300);
  125. setLocation(100,100);
  126. pack();
  127. setVisible(true);
  128. }
  129. /**
  130. *loginbutton/submitbuttonactionlistener
  131. *
  132. *@authorhx0272
  133. *
  134. */
  135. classButtonClickActionimplementsActionListener
  136. {
  137. publicvoidactionPerformed(ActionEvente)
  138. {
  139. if("submit".equals(e.getActionCommand()))
  140. {
  141. Stringstr=inputTxt.getText().trim();
  142. inputTxt.setText("");
  143. sendToServer(str);
  144. }
  145. elseif("login".equals(e.getActionCommand()))
  146. {
  147. connect();
  148. }
  149. }
  150. }
  151. /**
  152. *enterbeinputtedevent
  153. *
  154. *@authorhx0272
  155. */
  156. classEnterClickActionimplementsActionListener
  157. {
  158. publicvoidactionPerformed(ActionEvente)
  159. {
  160. Stringstr=inputTxt.getText().trim();
  161. inputTxt.setText("");
  162. sendToServer(str);
  163. }
  164. }
  165. /**
  166. *sendmessagetoserver
  167. *
  168. *@authorhx0272
  169. */
  170. privatevoidsendToServer(Stringstr)
  171. {
  172. try
  173. {
  174. dos.writeUTF(name+":"+str);
  175. dos.flush();
  176. }
  177. catch(IOExceptione)
  178. {
  179. e.printStackTrace();
  180. }
  181. }
  182. /**
  183. *closeresource
  184. *
  185. *@authorhx0272
  186. */
  187. privatevoiddisConnect()
  188. {
  189. try
  190. {
  191. //clientSocket.close();
  192. //
  193. //dos.close();
  194. bConnect=false;
  195. }
  196. catch(Exceptione)
  197. {
  198. e.printStackTrace();
  199. }
  200. }
  201. /**
  202. *receivemessagefromserver
  203. *
  204. *@authorhx0272
  205. */
  206. privateclassReceiveimplementsRunnable
  207. {
  208. publicvoidrun()
  209. {
  210. try
  211. {
  212. while(bConnect)
  213. {
  214. Stringstr=dis.readUTF();
  215. showArea.setText(showArea.getText()+str+'/n');
  216. }
  217. }
  218. catch(IOExceptione)
  219. {
  220. javax.swing.JOptionPane.showMessageDialog(null,"connectservererror");
  221. }
  222. }
  223. }
  224. /**
  225. *connectionbegin
  226. *
  227. *@authorhx0272
  228. */
  229. privatevoidconnect()
  230. {
  231. try
  232. {
  233. if(ipTxt.getText().matches("//d{1,3}.//d{1,3}.//d{1,3}.//d{1,3}")&&portTxt.getText().matches("//d+"))
  234. {
  235. clientSocket=newSocket(ipTxt.getText(),Integer.parseInt(portTxt.getText()));
  236. dos=newDataOutputStream(clientSocket.getOutputStream());
  237. dis=newDataInputStream(clientSocket.getInputStream());
  238. bConnect=true;
  239. newThread(newReceive()).start();
  240. System.out.println("Iamcoming");
  241. javax.swing.JOptionPane.showMessageDialog(null,"connectserversuccess");
  242. submitBtn.setEnabled(true);
  243. inputTxt.addActionListener(newEnterClickAction());
  244. }
  245. else
  246. {
  247. javax.swing.JOptionPane.showMessageDialog(null,"portoripbeinputtedisillegal");
  248. }
  249. }
  250. catch(UnknownHostExceptionuhe)
  251. {
  252. javax.swing.JOptionPane.showMessageDialog(null,"connectservererror");
  253. }
  254. catch(IOExceptione)
  255. {
  256. javax.swing.JOptionPane.showMessageDialog(null,"connectservererror");
  257. }
  258. }
  259. }
使用说明:
1.先运行服务器端程序,设定好端口号
2.点击Start按钮,运行服务器
3.运行客户端程序
4.设定好昵称
5.设定与服务器端匹配的端口号和服务器的ip地址
6.点击Login按钮,登录到聊天系统
7.可以聊天了。

分享到:
评论

相关推荐

    java基于socket/server的多线程聊天室程序,可以公聊和私聊。

    综上所述,本程序通过综合运用Java Socket编程、多线程技术和Swing图形界面库,成功实现了具有公聊和私聊功能的聊天室应用。这对于学习网络编程、多线程以及Java GUI开发都有着重要的参考价值。

    java Socket,Swing聊天室系统的设计与实现答辩.ppt

    java Socket,Swing聊天室系统的设计与实现答辩.ppt

    java Socket,Swing聊天室系统的设计与实现毕业论文.doc

    "java Socket,Swing聊天室系统的设计与实现毕业论文" 本资源摘要信息提供了关于 Java Socket 和 Swing 聊天室系统的设计与实现的毕业论文。该论文旨在设计和实现一个基于 C/S 架构的聊天室系统,使用 Java 语言、...

    Java swing实现简单的C/S聊天及文件传输系统

    在这个项目中,"Java swing实现简单的C/S聊天及文件传输系统"是利用Swing构建一个客户端/服务器(Client/Server)架构的聊天和文件传输应用。这个系统允许用户通过网络进行文本聊天并交换文件。以下是关于这个项目的...

    C/S聊天程序(JAVA,C/S)

    7. **用户界面**:客户端的用户界面通常使用Java Swing或JavaFX库来构建,提供友好的交互体验,包括文本输入框、聊天窗口和按钮等元素。 8. **事件驱动编程**:Java的事件模型使得程序能够响应用户的输入,如点击...

    java swing socket写的聊天工具

    Java Swing 是Java GUI(图形用户界面)库,用于构建桌面应用程序。...总的来说,这个Java Swing和Socket结合的聊天工具是一个综合性的项目,涵盖了GUI设计、网络编程、多线程和并发控制等多个IT领域的知识点。

    java+swing聊天室

    Java Swing聊天室是一种基于Java GUI(图形用户界面)框架Swing构建的实时通信应用程序。Swing是Java标准库的一部分,提供了丰富的组件库,用于创建桌面应用程序。在这个项目中,我们将探讨如何利用Java Swing来实现...

    java swing socket聊天

    在这个Java Swing聊天应用中,服务器端会监听特定的端口,等待客户端的连接请求。当客户端连接成功后,服务器会为每个客户端创建一个新的Socket连接,以实现一对一的通信。客户端则通过Socket连接到服务器,向服务器...

    面试作品java c/s聊天室带简单界面

    2. **GUI(图形用户界面)**:Java的Swing或JavaFX库可以用来创建用户友好的交互界面,包括登录窗口、聊天窗口、在线用户列表等。用户可以通过GUI输入和查看信息,增强了用户体验。 3. **文件IO**:文件输入/输出在...

    java swing+socket实现多人聊天程序

    java 利用swing+socket实现多人聊天程序,分客户端,服务端,运行效果参考博客 https://blog.csdn.net/wcc27857285/article/details/84038401

    Java聊天室 Swing编程 socket

    Java聊天室是一个基于Swing图形用户界面(GUI)和Socket通信技术实现的桌面应用程序。Swing是Java标准版(Java SE)的一部分,提供了一套丰富的组件库,用于创建美观、功能丰富的用户界面。Socket编程是网络编程的...

    即时聊天程序java socket swing

    在这个场景中,Java Socket 和 Swing 框架被广泛应用于构建客户端-服务器(C/S)架构的系统。下面我们将深入探讨这些技术及其在即时聊天程序中的应用。 1. **Java Socket** Java Socket 是 Java 提供的网络编程...

    Java TCP /IP socket 自制简易聊天工具

    在UI方面,这个简易聊天工具可能使用了Java的Swing或JavaFX库来创建图形用户界面。用户可以输入文本,点击发送按钮将消息通过Socket发送到服务器,同时,程序也会从服务器接收消息并在界面上显示。 代码结构可能...

    仿QQ聊天系统(java swing)

    【标题】"仿QQ聊天系统(java swing)"是一个基于Java Swing开发的桌面...通过这个项目,学习者可以锻炼解决问题的能力,提高对Java Swing、多线程和Socket编程的理解,并了解如何将这些技术应用于实际的聊天系统中。

    java的Socket实现的多人聊天程序

    Java的Socket实现的多人聊天程序是一个基于网络通信的项目,主要利用了Java的Socket类来构建客户端和服务端的通信桥梁。Socket是TCP/IP协议的一部分,它提供了两台计算机之间进行数据传输的基础。在这个项目中,...

    java swing 多功能 聊天室

    通过查看和学习这个项目的源码,开发者可以深入理解Java Swing在实际项目中的应用,以及如何结合网络编程实现一个功能完善的聊天室系统。 总的来说,"java swing 多功能 聊天室"项目展示了Java Swing在构建复杂GUI...

    基于java Swing 框架使用socket技术开发的即时通讯系统【源码+数据库】

    本项目是一套基于java Swing 框架使用socket技术开发的即时通讯系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 ...

    Java+Swing即时聊天系统,客户端和服务端,多线程,socket

    总结起来,Java+Swing即时聊天系统是通过结合Java的Swing库构建用户界面,利用多线程进行并发处理,通过Socket进行网络通信,实现用户间的实时消息传递。这样的系统为学习和理解Java的GUI编程、多线程以及网络编程...

    java多线程+Socket+Swing做的局域网聊天程序

    【标题】"java多线程+Socket+Swing做的局域网聊天程序"涉及的核心知识点主要涵盖Java编程、多线程、网络通信以及图形用户界面设计。以下将详细阐述这些关键概念及其在实现局域网聊天程序中的应用。 **1. Java编程**...

Global site tag (gtag.js) - Google Analytics