server.java

  1. import java.io.*;
  2. import java.net.*;
  3. import java.text.SimpleDateFormat;
  4. import java.util.*;
  5. import java.awt.*;
  6. import javax.swing.*;
  7.  
  8. @SuppressWarnings("serial")
  9. public class Server extends JFrame {
  10. // Text area for displaying data
  11. private JTextArea jta = new JTextArea();
  12. ArrayList<Client> clients = new ArrayList<Client>();
  13. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  14. Date d = new Date();
  15. String time = format.format(d);
  16. // Statistics the number of clients
  17. int clientNo = 0;
  18.  
  19. public static void main(String[] args) {
  20. new Server();
  21. }
  22.  
  23. public Server() {
  24. // Place text area on the frame
  25. setLayout(new BorderLayout());
  26. add(new JScrollPane(jta), BorderLayout.CENTER);
  27.  
  28. setTitle("Server");
  29. setSize(500, 300);
  30. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  31. setVisible(true); // It is necessary to show the frame here!
  32.  
  33. ServerSocket serverSocket = null;
  34. try {
  35. // Create a server socket
  36. serverSocket = new ServerSocket(2014);
  37. } catch (IOException ex) {
  38. jta.append(" ***端口已被占用!*** " + '\n');
  39. }
  40. jta.append(" ***服务器启动时间: " + time + "***" + '\n');
  41.  
  42. while (true) {
  43. Socket socket = null;
  44. try {
  45. // Listen for a connection request
  46. socket = serverSocket.accept();
  47. } catch (IOException e) {
  48. e.printStackTrace();
  49. }
  50. // To display client inetAddress
  51. InetAddress inetAddress = socket.getInetAddress();
  52. clientNo++;
  53. jta.append(" Client " + clientNo + '\n');
  54. jta.append(" Host name is " + inetAddress.getHostName() + '\n');
  55. jta.append(" IP Address is " + inetAddress.getHostAddress() + '\n');
  56.  
  57. // Create a new Thread for client
  58. Client task = new Client(socket);
  59. clients.add(task);
  60. new Thread(task).start();
  61. }
  62. }
  63.  
  64. class Client implements Runnable {
  65. Socket socket;
  66. // Create data input and output streams
  67. DataInputStream inputFromClient = null;
  68. DataOutputStream outputToClient = null;
  69. Client c = null;
  70.  
  71. public Client(Socket socket) {
  72. this.socket = socket;
  73. try {
  74. inputFromClient = new DataInputStream(socket.getInputStream());
  75. } catch (IOException e) {
  76. e.printStackTrace();
  77. }
  78. try {
  79. outputToClient = new DataOutputStream(socket.getOutputStream());
  80. } catch (IOException e) {
  81. e.printStackTrace();
  82. }
  83. }
  84.  
  85. public void sentAll(String str) {
  86. try {
  87. // Receive message from the client
  88. outputToClient.writeUTF(str);
  89. } catch (SocketException e) {
  90. if (c != null)
  91. clients.remove(c);
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. }
  95. }
  96.  
  97. public void run() {
  98. try {
  99. while (true) {
  100. // Receive sentence from the client
  101. String sentence = inputFromClient.readUTF();
  102. // Send sentence back to the client
  103. for (int i = 0; i < clients.size(); i++) {
  104. c = clients.get(i);
  105. c.sentAll(sentence);
  106. }
  107.  
  108. // Display to the text area
  109. jta.append(" " + time + "\n");
  110. jta.append(" " + sentence + '\n');
  111. }
  112. } catch (IOException e) {
  113. // e.printStackTrace();
  114. clientNo--;
  115. if (clientNo == 0) {
  116. jta.append(" ***无客户端连接!***" + "\n");
  117. clients.remove(c); // 防止新用户使用
  118. } else {
  119. jta.append(" ***退出一用户! 剩余用户: " + clientNo + "***" + "\n");
  120. }
  121. }
  122. }
  123. }
  124. }

client.java

  1. import java.io.*;
  2. import java.net.*;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import java.awt.*;
  6. import java.awt.event.*;
  7. import javax.swing.*;
  8.  
  9. @SuppressWarnings("serial")
  10. public class Client extends JFrame {
  11. // Text field for receiving data
  12. private JTextField jtfName = new JTextField(); // Enter Name
  13. private JTextField jtfMessage = new JTextField(); // Enter Message
  14.  
  15. // Text Area to display data
  16. private JTextArea jta = new JTextArea();
  17.  
  18. // Button for send massage
  19. private JButton jbSend = new JButton("Send");
  20.  
  21. // IO streams
  22. private DataOutputStream toServer;
  23. private DataInputStream fromServer;
  24.  
  25. public static void main(String[] args) {
  26. new Client();
  27. }
  28.  
  29. public Client() {
  30. // Panel p to hold the label and text field
  31. JPanel p = new JPanel();
  32. p.setLayout(new GridLayout(2, 2));
  33. p.add(new JLabel(" Enter Name: "));
  34. p.add(jtfName);
  35. p.add(new JLabel(" Enter Message: "));
  36. p.add(jtfMessage);
  37. jtfName.setHorizontalAlignment(JTextField.LEFT);
  38. jtfMessage.setHorizontalAlignment(JTextField.LEFT);
  39.  
  40. setLayout(new BorderLayout());
  41. add(p, BorderLayout.NORTH);
  42. add(new JScrollPane(jta), BorderLayout.CENTER);
  43. add(jbSend, BorderLayout.SOUTH);
  44.  
  45. // Register listener for jbSend button
  46. jbSend.addActionListener(new ButtonListener());
  47.  
  48. // Register listener for jtfName JTextField
  49. jtfName.addActionListener(new ButtonListener());
  50.  
  51. // Register listener for jtfMessage JTextField
  52. jtfMessage.addActionListener(new ButtonListener());
  53.  
  54. setTitle("Client");
  55. setSize(500, 300);
  56. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  57. setVisible(true); // It is necessary to show the frame here!
  58.  
  59. try {
  60. // Create a socket to connect to the server
  61. Socket socket = new Socket("localhost", 2014);
  62.  
  63. // Create an input stream to receive data from the server
  64. fromServer = new DataInputStream(socket.getInputStream());
  65.  
  66. // Create an output stream to send data to the server
  67. toServer = new DataOutputStream(socket.getOutputStream());
  68.  
  69. // Receive data from the server all the time
  70. while (true) {
  71. // read data from client
  72. String sentence = fromServer.readUTF();
  73. SimpleDateFormat format = new SimpleDateFormat(
  74. "yyyy-MM-dd HH:mm:ss");
  75. Date d = new Date();
  76. String time = format.format(d);
  77.  
  78. // Display to the text area
  79. jta.append(" " + time + "\n");
  80. jta.append(" " + sentence + "\n");
  81. }
  82. } catch (IOException ex) {
  83. jta.append(" ***服务器连接失败!***" + '\n');
  84. }
  85. }
  86.  
  87. private class ButtonListener implements ActionListener {
  88. public void actionPerformed(ActionEvent e) {
  89. try {
  90. // Get the Name and Message from the text field
  91. String Name = jtfName.getText().trim();
  92. String Message = jtfMessage.getText().trim();
  93. // Prevent send a blank message
  94. if (Name != null && Name.length() != 0 && Message != null
  95. && Message.length() != 0) {
  96. String data = Name + ": " + Message;
  97.  
  98. // Send the data to the server
  99. toServer.writeUTF(data);
  100. toServer.flush();
  101. } else
  102. jta.append(" ***警告:名称和内容均不能为空!*** " + "\n");
  103.  
  104. } catch (IOException ex) {
  105. System.err.println(ex);
  106. }
  107. }
  108. }
  109. }

下载链接: http://pan.baidu.com/s/1i3oQlyl密码: jk6q

Java版多人聊天室的更多相关文章

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

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

  2. java版两人聊天程序

    server.java import java.io.*; import java.net.*; import java.text.SimpleDateFormat; import java.util ...

  3. 多人聊天室(Java)

    第1部分 TCP和UDP TCP:是一种可靠地传输协议,是把消息按一个个小包传递并确认消息接收成功和正确才发送下一个包,速度相对于UDP慢,但是信息准确安全:常用于一般不要求速度和需要准确发送消息的场 ...

  4. java socket之多人聊天室Demo

    一.功能介绍 该功能实现了一个类似QQ的最简单多人聊天室,如下图所示. 二.目录结构 三.服务端 1)SocketServer类,该类是服务端的主类,主要负责创建聊天窗口,创建监听客户端的线程: pa ...

  5. Apache MiNa 实现多人聊天室

    Apache MiNa 实现多人聊天室 开发环境: System:Windows JavaSDK:1.6 IDE:eclipse.MyEclipse 6.6 开发依赖库: Jdk1.4+.mina-c ...

  6. Spring整合DWR comet 实现无刷新 多人聊天室

    用dwr的comet(推)来实现简单的无刷新多人聊天室,comet是长连接的一种.通常我们要实现无刷新,一般会使用到Ajax.Ajax 应用程序可以使用两种基本的方法解决这一问题:一种方法是浏览器每隔 ...

  7. Java网络编程案例---聊天室

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net包中JavaSE的API包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接口,来专注于解决 ...

  8. 66 网络编程(五)——TCP多线程实现多人聊天室

    思路 客户端读写各一个类,可以使内部类,实现Runnable.读写类都与服务器端建立连接,一个收,一个发. 客户端实现接收和转发.多线程实现每个客户端的连接(使与各客户端的连接独立). 服务器端中创建 ...

  9. 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室

    原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

随机推荐

  1. hbase安装 配置报错 zookeeper启动报错

    zookeeper安装问题,使用独立安装的zookeeper export HBASE_MANAGES_ZK=false   #如果使用独立安装的zookeeper这个地方就是false 创建zook ...

  2. Tensorflow报错:InvalidArgumentError: You must feed a value for placeholder tensor 'input_y' with dtype

    此错误神奇之处是每次第一次运行不会报错,第二次.第三次第四次....就都报错了.关掉重启,又不报错了,运行完再运行一次立马报错!搞笑! 折磨了我半天,终于被我给解决了! 问题解决来源于这边博客:htt ...

  3. day07-ip地址管理

    1. ip地址由网络地址位与主机地址位两部分构成. 如:172.16.45.10/16中网路地址为172.16.0.0.主机地址为172.16.45.10. 2. 查看系统网卡信息:ifconfig: ...

  4. 洛谷P4495 [HAOI2018]奇怪的背包(数论)

    题面 传送门 题解 好神仙的思路啊--orzyyb 因为不限次数,所以一个体积为\(V_i\)的物品可以表示出所有重量为\(\gcd(V_i,P)\)的倍数的物品,而所有物品的总和就是这些所有的\(\ ...

  5. mysql主从复制数据库

    mysql主从复制相信已经用得很多了,但是由于工作原因一直没怎么用过.趁着这段时间相对空闲,也就自己实现一遍.尽管互联网上已有大把类似的文章,但是自身实现的仍然值得记录. 环境: 主服务器:cento ...

  6. 解决tomcat启动 startup.bat的时候一闪而过(就是java环境变量的配置)

    系统变量配置:(解决tomcat启动 startup.bat的时候一闪而过) JAVA_HOME C:\Program Files (x86)\Java\jdk1.7.0_25 =========== ...

  7. CentOS71611安装Python3.5.3

    yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel gcc wget wg ...

  8. DataRow[]转DataTable

    DataRow[]有个扩展方法CopyToDataTable()

  9. Android---16进制与字节数组

    16进制字符串与字节数组进行转换 package string; import java.util.Arrays; /** * byte[]与16进制字符串相互转换 * * @date:2017年4月 ...

  10. n阶幻方

    前序 最近在学习一些经典的算法,搞得头昏脑涨,就想换换脑子.在家里的旧书堆里面乱翻,无意中将一本具有十多年历史的小学数学奥林匹克竞赛的书发掘了出来,能放到现在挺不容易的,就拿起来随便翻翻.看了看目录, ...