这段小代码是因为担任Java助教给刚学习Java的本科大二的小学弟小学妹们指导,他们的实验作业就是编写一个Java聊天室客户端和服务器,为了避免出纰漏,自己事先写了一下。

客户端Ui代码:

  1. package com.CS;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.awt.FlowLayout;
  5. import java.awt.GridBagLayout;
  6. import java.awt.GridLayout;
  7. import java.awt.event.ActionEvent;
  8. import java.awt.event.ActionListener;
  9.  
  10. import javax.swing.JButton;
  11. import javax.swing.JFrame;
  12. import javax.swing.JLabel;
  13. import javax.swing.JPanel;
  14. import javax.swing.JScrollPane;
  15. import javax.swing.JTextArea;
  16. import javax.swing.JTextField;
  17.  
  18. public class Client_UI extends JFrame{
  19. public JButton Connect; //创建连接按钮;
  20. public JButton Say; //创建发送按钮;
  21. public JPanel Panel; //创建一个用于存放所有组件的容器;
  22. public JPanel Panel_up; //创建一个用于存放界面最上面各个组件的容器;
  23. public JPanel Panel_down; //创建一个用于存放界面最下面各个组件的容器;
  24. public JTextField Server_IP; //用于写IP地址的组件;
  25. public JTextField Server_Port; //用于写端口号的组件;
  26. public JTextField Say_Send; //用于写要发送的文字的内容的组件;
  27. public JTextArea Text_Show; //用于显示相关信息的组件;
  28.  
  29. public Client_Thread Server; //创建一个客户端线程;
  30.  
  31. public Client_UI(){
  32. Connect=new JButton("Connect");
  33. Say=new JButton("Say");
  34. Server_IP=new JTextField(10);
  35. Server_Port=new JTextField(5);
  36. Say_Send=new JTextField(25);
  37.  
  38. Text_Show=new JTextArea();
  39. JScrollPane ScrollPane=new JScrollPane(); //使之可以滚动,且设置滚动一直存在;
  40. ScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
  41. ScrollPane.setViewportView(Text_Show);
  42.  
  43. Panel_up=new JPanel();
  44. // Panel_up.setLayout(new GridLayout(1,5));
  45. // Panel_up.setLayout(new FlowLayout(FlowLayout.LEFT));
  46. Panel_up.setLayout(new GridBagLayout()); //布局方法,调试得出该布局方法最合理;
  47. Panel_up.add(new JLabel("Server IP"));
  48. Panel_up.add(Server_IP);
  49. Panel_up.add(new JLabel("Server Port"));
  50. Panel_up.add(Server_Port);
  51. Panel_up.add(Connect);
  52.  
  53. Panel_down=new JPanel();
  54. // Panel_down.setLayout(new GridLayout(1,3));
  55. Panel_down.setLayout(new FlowLayout(FlowLayout.LEFT)); //布局方法,调试得知,从左边最先开始存放组件。
  56. Panel_down.add(new JLabel("Say"));
  57. Panel_down.add(Say_Send);
  58. Panel_down.add(Say);
  59.  
  60. Panel=new JPanel();
  61. Panel.setLayout(new BorderLayout());
  62. Panel.add(Panel_up, BorderLayout.NORTH);
  63. Panel.add(ScrollPane);
  64. Panel.add(Panel_down,BorderLayout.SOUTH);
  65.  
  66. this.setTitle("客户端");
  67. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  68. this.setSize(400, 300);
  69. this.setLocation(600, 200);
  70. this.add(Panel);
  71. this.setVisible(true);
  72.  
  73. //对connect按钮增加监听;
  74. Connect.addActionListener(new ActionListener(){
  75. @Override
  76. public void actionPerformed(ActionEvent e) {
  77. Server=new Client_Thread(Client_UI.this);
  78. }
  79. });
  80.  
  81. //对Say按钮增加监听;
  82. Say.addActionListener(new ActionListener(){
  83. @Override
  84. public void actionPerformed(ActionEvent e) {
  85. Server.SendMessage(Say_Send.getText());
  86. Say_Send.setText("");
  87. }
  88. });
  89. }
  90.  
  91. public static void main(String args[]){
  92. Client_UI clientui=new Client_UI();
  93. }
  94.  
  95. }

客户端线程代码:

  1. package com.CS;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.io.PrintStream;
  7. //import java.io.PrintWriter;
  8. import java.net.Socket;
  9.  
  10. public class Client_Thread extends Thread {
  11. Client_UI UI;
  12. Socket client_socket;
  13. BufferedReader Read;
  14. PrintStream Write;
  15.  
  16. public Client_Thread(Client_UI ui){
  17. this.UI=ui;
  18. String IP=UI.Server_IP.getText().trim(); //获取IP地址;
  19. int Port=Integer.parseInt(UI.Server_Port.getText().trim()); //获取端口号,并将其转换成int型;
  20. try {
  21. client_socket=new Socket(IP,Port); //设置连接服务器的IP地址和端口号;
  22. Println("客户端连接服务器成功!");
  23. Read=new BufferedReader(new InputStreamReader(client_socket.getInputStream()));
  24. Write=new PrintStream(client_socket.getOutputStream());
  25. } catch (IOException e) {
  26. Println("客户端连接服务器失败!");
  27. e.printStackTrace();
  28. }
  29.  
  30. new Thread(new Runnable(){
  31. @Override
  32. public void run() {
  33. String message="";
  34. while(true){
  35. try {
  36. message=Read.readLine();
  37. } catch (IOException e) {
  38. Println("连接服务器中断!");
  39. e.printStackTrace();
  40. break;
  41. }
  42. if(message!=null&&message.trim()!=""){
  43. Println(message);
  44. }
  45. }
  46. }
  47. }).start();
  48. }
  49.  
  50. public void Println(String s){
  51. if(s!=null){
  52. this.UI.Text_Show.setText(this.UI.Text_Show.getText()+s+"\n");
  53. System.out.println(s + "\n");
  54. }
  55. }
  56.  
  57. public void SendMessage(String text){
  58. try{
  59. Write.println(text);
  60. }catch(Exception e){
  61. Println(e.toString());
  62. }
  63. }
  64.  
  65. }

服务器UI代码:

  1. package com.Server;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.awt.FlowLayout;
  5. import java.net.Socket;
  6. import java.util.List;
  7. import java.awt.event.ActionEvent;
  8. import java.awt.event.ActionListener;
  9.  
  10. import javax.swing.JButton;
  11. import javax.swing.JFrame;
  12. import javax.swing.JLabel;
  13. import javax.swing.JPanel;
  14. import javax.swing.JScrollPane;
  15. import javax.swing.JTextArea;
  16. import javax.swing.JTextField;
  17.  
  18. public class Server_UI extends JFrame{
  19. public JButton Start;
  20. public JButton Say;
  21. public JTextField Port_Msg;
  22. public JTextField Say_Msg;
  23. public JPanel Panel_up;
  24. public JPanel Panel;
  25. public JPanel Panel_down;
  26. public JTextArea Text_show;
  27. public Server server;
  28. public List<Socket> clients; //保存服务器接收到的客户端;
  29.  
  30. public Server_UI(){
  31. Start=new JButton("Start");
  32. Say=new JButton("Say");
  33.  
  34. Port_Msg=new JTextField(25);
  35. Say_Msg=new JTextField(25);
  36.  
  37. Text_show=new JTextArea();
  38. JScrollPane ScrollPane=new JScrollPane();
  39. ScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
  40. ScrollPane.setViewportView(Text_show);
  41.  
  42. Panel_up=new JPanel();
  43. Panel_up.setLayout(new FlowLayout());
  44. Panel_up.add(new JLabel("Port"));
  45. Panel_up.add(Port_Msg);
  46. Panel_up.add(Start);
  47.  
  48. Panel_down=new JPanel();
  49. Panel_down.setLayout(new FlowLayout());
  50. Panel_down.add(new JLabel("Say"));
  51. Panel_down.add(Say_Msg);
  52. Panel_down.add(Say);
  53.  
  54. Panel=new JPanel();
  55. Panel.setLayout(new BorderLayout());
  56. Panel.add(Panel_up, BorderLayout.NORTH);
  57. Panel.add(ScrollPane,BorderLayout.CENTER);
  58. Panel.add(Panel_down,BorderLayout.SOUTH);
  59.  
  60. this.setTitle("服务器");
  61. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  62. this.setSize(400, 300);
  63. this.setLocation(100, 200);
  64. this.add(Panel);
  65. this.setVisible(true);
  66.  
  67. //设置Start监听器;
  68. Start.addActionListener(new ActionListener(){
  69. @Override
  70. public void actionPerformed(ActionEvent e) {
  71. server=new Server(Server_UI.this);
  72. }
  73. });
  74.  
  75. //设置Say监听器;
  76. Say.addActionListener(new ActionListener(){
  77. @Override
  78. public void actionPerformed(ActionEvent e) {
  79. server.Send_Message(Say_Msg.getText());
  80. Say_Msg.setText("");
  81. }
  82. });
  83. }
  84.  
  85. public static void main(String args[]){
  86. Server_UI serverUI=new Server_UI();
  87. }
  88. }

服务器线程代码:

  1. package com.Server;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.io.PrintStream;
  7. import java.io.PrintWriter;
  8. import java.net.ServerSocket;
  9. import java.net.Socket;
  10. import java.util.ArrayList;
  11.  
  12. public class Server extends Thread{
  13. Server_UI ui;
  14. BufferedReader Read;
  15. PrintStream Write;
  16. ServerSocket server;
  17. public Server(Server_UI UI){
  18. this.ui=UI;
  19. //设置服务器的端口;
  20. int port=Integer.parseInt(ui.Port_Msg.getText().trim());
  21. try {
  22. server=new ServerSocket(port);
  23. Println("端口设置成功!");
  24. } catch (IOException e) {
  25. Println("端口设置失败!");
  26. e.printStackTrace();
  27. }
  28. this.ui.clients=new ArrayList<Socket>();
  29.  
  30. //创建一个线程,用来等待客户端的连接;
  31. new Thread(new Runnable(){
  32. @Override
  33. public void run() {
  34. while(true){
  35. Println("等待客户端接入...");
  36. Socket Client = null;
  37. try {
  38. Client = server.accept();
  39. ui.clients.add(Client);
  40. Println("成功连接到客户端"+Client.toString());
  41. new ListenClient(ui,Client);
  42. } catch (IOException e) {
  43. Println("连接客户端失败!");
  44. Println(Client.toString());
  45. e.printStackTrace();
  46. }
  47. }
  48.  
  49. }
  50. }).start();
  51. }
  52.  
  53. public synchronized void Send_Message(String s){
  54. for(int i=0;i<this.ui.clients.size();i++){
  55. Socket client=ui.clients.get(i);
  56. try {
  57. Write=new PrintStream(client.getOutputStream());
  58. Write.println(s);
  59. } catch (IOException e) {
  60. Println(e.toString());
  61. e.printStackTrace();
  62. }
  63. }
  64. }
  65.  
  66. public void Println(String s){
  67. if(s!=null){
  68. this.ui.Text_show.setText(this.ui.Text_show.getText()+s+"\n");
  69. System.out.println(s + "\n");
  70. }
  71. }
  72. }
  73.  
  74. class ListenClient extends Thread{
  75. public Server_UI ui;
  76. public Socket client;
  77. BufferedReader Read;
  78. PrintStream Write;
  79. public ListenClient(Server_UI UI,Socket Client){
  80. this.ui=UI;
  81. this.client=Client;
  82. //创建一个接受数据的线程;
  83. new Thread(new Runnable(){
  84. @Override
  85. public void run() {
  86. String message="";
  87. while(true){
  88. try {
  89. Read=new BufferedReader(new InputStreamReader(client.getInputStream()));
  90. message=Read.readLine();
  91. Println(message);
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. }
  95. }
  96.  
  97. }
  98.  
  99. }).start();
  100. }
  101. public void Println(String s){
  102. if(s!=null){
  103. this.ui.Text_show.setText(this.ui.Text_show.getText()+s+"\n");
  104. System.out.println(s + "\n");
  105. }
  106. }
  107. }

[Java小程序]聊天室——Socket和ServerSocket的使用的更多相关文章

  1. 微信小程序--聊天室小程序(云开发)

    微信小程序 -- 聊天室小程序(云开发) 从微信小程序开发社区更新watch接口之后,一直在构思这个项目.项目已经完成很久,但是一直都没有空写一篇博客记录展示一下. 开源地址 wx-cloud-im: ...

  2. Java实现简易聊天室

    Java实现简易聊天室 在学习<Java从入门到精通>这本书,网络通信,基于TCP实现的简易聊天室,我这里对书中的代码略做了修改,做个记录. 这里先放一下运行效果图,代码放在最后. 运行效 ...

  3. 输出多行字符的一个简单JAVA小程序

    public class JAVA { public static void main(String[] args) { System.out.println("-------------- ...

  4. 浏览器兼容java小程序配置说明

    最近在使用的一个web应用系统是内嵌了java小程序,遇到了各种浏览器兼容性问题,现梳理如下: 1.通过以下链接检测当前电脑是否已经安装有java https://java.com/zh_CN/dow ...

  5. 框架一般用作Java应用程序的窗口,而Applet是Java小程序的窗口

    框架一般用作Java应用程序的窗口,而Applet是Java小程序的窗口. 与Frame不同,Applet是在网页中显示的,也可以通过添加Panel进行组件布局. package TomAwt; im ...

  6. java小程序---简陋版多人聊天室

    功能需求: 1 每运行一次主函数,创建一个客户端聊天界面; 2 客户端界面分三块,公屏(显示所有客户端发送的信息),私屏(用于输入个人想要发送的信息),发送按钮(点击一次,将客户端信息发送到服务端) ...

  7. 用c写一个小的聊天室程序

    1.聊天室程序——客户端 客户端我也用了select进行I/O复用,同时监控是否有来自socket的消息和标准输入,近似可以完成对键盘的中断使用. 其中select的监控里,STDOUT和STDIN是 ...

  8. java多线程控制台聊天室(转)

    用java多线程实现一个控制台聊天室,呵呵,好玩! 聊天室服务器端 package tf.thread; import java.io.BufferedReader; import java.io.I ...

  9. java bio 之聊天室

    最近在复习java io相关知识 ,发现很多细节之前没学习到位,原理也没吃透,只能感叹本人愚钝. 复习到bio,顺手写了个简单的聊天室功能,并和大家分享下. 服务端: package io.QQ聊天室 ...

随机推荐

  1. 在linux上处理base64加密和解密

    http://snailwarrior.blog.51cto.com/680306/142472/ 2.从标准输入读取文件内容,base64编码并打印到标准输出 [root@localhost tes ...

  2. tomcat调优配置

    今天遇到一个tomcat服务注册后配置Java参数没效果,最后在注册表中删除原来的tomcat服务后,顺便看了一下tomcat的调优配置,看别人总结的不错,就转载一下. Tomcat.Jetty.Gl ...

  3. bzoj1016 [JSOI2008]最小生成树计数——Kruskal+矩阵树定理

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1016 从 Kruskal 算法的过程来考虑产生多种方案的原因,就是边权相同的边有一样的功能, ...

  4. 杂项-Java:FreeMarker

    ylbtech-杂项-Java:FreeMarker 1.返回顶部 1. FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源 ...

  5. FPGA基础入门篇(四) 边沿检测电路

    FPGA基础入门篇(四)--边沿检测电路 一.边沿检测 边沿检测,就是检测输入信号,或者FPGA内部逻辑信号的跳变,即上升沿或者下降沿的检测.在检测到所需要的边沿后产生一个高电平的脉冲.这在FPGA电 ...

  6. open_basedir 报错

    Warning: require(): open_basedir restriction in effect. File(/home/www/blog/vendor/autoload.php) is ...

  7. 如何保证access_token长期有效--微信公众平台开发

    http://blog.csdn.net/qq_33556185/article/details/52758781 import javax.servlet.ServletContext; impor ...

  8. KMP POJ 1961 Period

    题目传送门 /* 题意:求一个串重复出现(>1)的位置 KMP:这简直和POJ_2406没啥区别 */ /******************************************** ...

  9. 386 Lexicographical Numbers 字典序排数

    给定一个整数 n, 返回从 1 到 n 的字典顺序.例如,给定 n =1 3,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] .请尽可能的优化算法的时间复杂度和空间复杂度. 输入 ...

  10. [译]Customizing Operations

    Customizing Operations定制操作 There is an ongoing development today where more and more protocols are b ...