Java版多人聊天室
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
作者:何海洋
本博客内容主要以学习、研究和分享为主,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。