Java多人聊天室第一版


 1 package cn.zhang.chat;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.PrintWriter;
 5 
 6 /**
 7   * 所有用戶均有的信息,單獨設為一個類
 8  * @author 
 9  *
10  */
11 
12 public class Account {
13 
14     //封裝,屬性設為私有
15     private String name;
16     private BufferedReader reader;
17     private PrintWriter writer;
18 
19     //設置相應的set和get方法
20     public String getName() {
21         return name;
22     }
23 
24     public void setName(String name) {
25         this.name = name;
26     }
27 
28     public BufferedReader getReader() {
29         return reader;
30     }
31 
32     public void setReader(BufferedReader reader) {
33         this.reader = reader;
34     }
35 
36     public PrintWriter getWriter() {
37         return writer;
38     }
39 
40     public void setWriter(PrintWriter writer) {
41         this.writer = writer;
42     }
43 }
 1 package cn.zhang.chat;
 2 
 3 import java.io.*;
 4 import java.net.Socket;
 5 import java.util.Scanner;
 6 
 7 public class ChatClient {
 8 
 9     public static void main(String[] args) throws Exception {
10         Scanner sc = new Scanner(System.in);
11 
12         while (true) {
13             System.out.print("請輸入昵稱:");
14             String name = sc.nextLine();
15 
16             Socket s = new Socket(UserData.HOST, UserData.PORT);
17             InputStream in = s.getInputStream();
18             OutputStream out = s.getOutputStream();
19 
20             BufferedReader reader = new BufferedReader(new InputStreamReader(in));
21             PrintWriter writer = new PrintWriter(new OutputStreamWriter(out), true);
22 
23             writer.println(name);
24             String temp = reader.readLine();
25             if (temp.equals("success")) {
26                 // 啟動新線程監聽消息
27                 Account user = new Account();
28                 user.setReader(reader);
29                 user.setWriter(writer);
30                 user.setName(name);
31                 ReceiveMessage rm = new ReceiveMessage(user);
32                 new Thread(rm).start();
33 
34                 // 給服務器發消息
35                 while (true) {
36                     
37                     String msg = sc.nextLine();
38                     writer.println(msg);
39                     
40                 }
41 
42             } else {
43                 
44                 System.out.println(temp);
45                 
46             }
47         }
48     }
49 }
 1 package cn.zhang.chat;
 2 
 3 import java.io.*;
 4 import java.net.ServerSocket;
 5 import java.net.Socket;
 6 /**
 7   * 服務器端的ChatServer
 8  * @author 
 9  *
10  */
11 public class ChatServer {
12 
13     public static void main(String[] args) throws Exception {
14 
15         //等待用戶連接之前,創建一個SeverSocket
16         ServerSocket ss = new ServerSocket(UserData.PORT);
17 
18         while (true) {
19             System.out.println("等待鏈接");
20             Socket s = ss.accept();
21 
22             InputStream in = s.getInputStream();
23             OutputStream out = s.getOutputStream();
24 
25             BufferedReader reader = new BufferedReader(new InputStreamReader(in));
26             PrintWriter writer = new PrintWriter(new OutputStreamWriter(out), true);
27 
28             String name = reader.readLine();//讀入名字
29 
30             boolean flag = false;
31             
32             //foreach循環遍歷名字,若名字相同,則返回用戶名已存在
33             for (Account a : UserData.USERS) {
34                 if (a.getName().equals(name)) {
35                     flag = true;
36                 }
37             }
38             if (flag) {
39                 writer.println("用戶名已存在~~~");
40             } else {
41                 writer.println("success");
42             }
43 
44             // 啟動一個新的線程監聽消息
45             Account user = new Account();
46             user.setName(name);
47             user.setWriter(writer);
48             user.setReader(reader);
49 
50             SendMessage sm = new SendMessage(user);
51             new Thread(sm).start();
52 
53             UserData.USERS.add(user);
54             for (Account a : UserData.USERS) {
55                 a.getWriter().println("[" + name + "]進入聊天室,當前在線人數:" + UserData.USERS.size());
56             }
57         }
58 
59     }
60 
61 }
 1 package cn.zhang.chat;
 2 
 3 public class ReceiveMessage implements Runnable {
 4 
 5     private Account user;
 6 
 7     public ReceiveMessage(Account user) {
 8         this.user = user;
 9     }
10 
11     @Override
12     public void run() {
13         while (true) {
14             try {
15                 String msg = this.user.getReader().readLine();
16                 System.out.println(msg);
17             } catch (Exception e) {
18                 e.printStackTrace();
19             }
20         }
21     }
22 }
 1 package cn.zhang.chat;
 2 
 3 
 4 import java.io.IOException;
 5 
 6 public class SendMessage implements Runnable {
 7 
 8     private Account user;
 9 
10     public SendMessage(Account user) {
11         this.user = user;
12     }
13 
14     //重寫父類方法
15     @Override
16     public void run() {
17         while (true) {
18             try {
19                 String msg = this.user.getReader().readLine();
20                 for (Account a : UserData.USERS) {
21                     if (!a.getName().equals(this.user.getName())) {
22                         a.getWriter().println(this.user.getName() + " 說:" + msg);
23                     }
24                 }
25 
26             } catch (Exception e) {
27                 UserData.USERS.remove(this.user);
28                 for (Account a : UserData.USERS) {
29                     System.out.println("[" + this.user.getName() + "]退出了聊天室,當前在線人數:" + UserData.USERS.size());
30                     a.getWriter().println("[" + this.user.getName() + "]退出了聊天室,當前在線人數:" + UserData.USERS.size());
31                     break;
32                 }
33                 
34                 e.printStackTrace();
35             }
36         }
37     }
38 }
 1 package cn.zhang.chat;
 2 import java.util.ArrayList;
 3 import java.util.List;
 4 /**
 5   * 用戶基本信息
 6  * @author 
 7  *
 8  */
 9 public class UserData {
10 
11     public static final String HOST = "127.0.0.1";
12     public static final int PORT = 8888;
13 
14     public static final List<Account> USERS = new ArrayList<>();
15 
16 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM