激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java實現小型局域網群聊功能(C/S模式)

java實現小型局域網群聊功能(C/S模式)

2020-06-07 12:18西門吃雪 JAVA教程

這篇文章主要介紹了java利用TCP協議實現小型局域網群聊功能(C/S模式) ,感興趣的小伙伴們可以參考一下

本文實例為大家分享了java群聊功能,供大家參考,具體內容如下

Java 對TCP協議的支持:
--> java.net包中定義了兩個類ServerSocket 和Socket ,分別用來實現雙向連接的server 端和client 端。 
--> Client 類定義客戶端 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.dragon.java.tcpchat;
 
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
 
/**
 * 客戶端
 *
 * @author Auser
 *
 */
public class Client {
  public static void main(String args[]) throws UnknownHostException,
      IOException {
    Socket client = new Socket("192.168.1.188", 10000);
 
    // 穿件發送信息的線程
    new ClientSend(client).start();
    // 創建接收信息的線程
    new ClientReceive(client).start();
     // 因為要實現聊天功能,而不是只發送一次信息,所以輸出流和客戶端都不能關閉。
    // client.shutdownOutput();
    // client.close();
 
  }
}

--> ClientSend 類 定義客戶端向服務端發送信息的線程 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.dragon.java.tcpchat;
 
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
 
/**
 * 客戶端向服務端發送信息的線程
 *
 * @author Auser
 *
 */
public class ClientSend extends Thread {
  private Scanner scanner;
  private Socket socket;
 
  public ClientSend(Socket socket) {
    this.socket = socket;
  }
 
  @Override
  public void run() {
    scanner = new Scanner(System.in);
 
    try {
      PrintStream ps = new PrintStream(socket.getOutputStream());
      String line = "";
      // 阻塞式發送信息
      while ((line = scanner.nextLine()) != null) {
        ps.println(line);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

--> ClientReceive 類 定義客戶端接收服務端信息的線程 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.dragon.java.tcpchat;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
 
/**
 * 客戶端接收信息的線程
 *
 * @author Auser
 *
 */
public class ClientReceive extends Thread {
  private Socket socket;
 
  public ClientReceive(Socket socket) {
    this.socket = socket;
  }
 
  @Override
  public void run() {
    try {
      BufferedReader br = new BufferedReader(new InputStreamReader(
          socket.getInputStream()));
      // 按行接收信息
      String line = "";
      while ((line = br.readLine()) != null) {
        System.out.println(line);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
 
}

--> Server 類定義服務端 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.dragon.java.tcpchat;
 
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
 
/**
 * 服務器
 *
 * @author Auser
 *
 */
public class Server {
  public static void main(String[] args) throws IOException,
      InterruptedException {
    List<Socket> list = new ArrayList<>();
 
    // 創建服務器端的套接字
    ServerSocket server = new ServerSocket(10000);
 
    while (true) {
      // 接收客戶端的阻塞方法
      Socket socket = server.accept();
      // 設計到多個線程可能會對集合進行增刪的操作,要進行同步的處理
      synchronized (list) {
        list.add(socket);
      }
      // 啟動一個新的線程去處理這個客戶端的交流
      new HandleSocket(socket, list).start();
    }
     // 因為不知道客戶端什么時候發送信息,所以服務端要一直開啟不能關閉。
  }
}

--> HandleSocket 類對連接到服務端的客戶端進行操作(上下線通知、屏蔽拉黑、將信息發送到每個客戶端等...) 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package com.dragon.java.tcpchat;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.List;
 
/**
 * 處理每個(單個)連接到服務器的客戶端的線程
 *
 * @author Auser
 *
 */
public class HandleSocket extends Thread {
 
  private Socket socket;
  private List<Socket> list;
 
  /**
   * 構造方法
   *
   * @param socket
   *      當前連接的客戶端
   * @param list
   *      存儲已連接客戶端的集合
   */
  public HandleSocket(Socket socket, List<Socket> list) {
    this.socket = socket;
    this.list = list;
  }
 
  /**
   * 線程run方法
   */
  @Override
  public void run() {
    InetAddress address = socket.getInetAddress(); // 獲取連接到服務器的這的客戶端的地址
    String ip = address.getHostAddress();
    System.out.println(ip + "上線了!");
    if (ip.equals("192.168.1.117")) {
      synchronized (list) {
        sendToAll(ip + "由于違規操作,已被拉入黑名單!");
        list.remove(socket);
      }
      return;
    }
 
    try {
      BufferedReader br = new BufferedReader(new InputStreamReader(
          socket.getInputStream(), "gbk"));
 
      String line = "";
      while ((line = br.readLine()) != null) {
        String msg = ip + ":" + line;
        System.out.println(msg); // 輸出到服務器端的控制臺
        // 把這個客戶端說的話,發給其他所有的客戶端
        sendToAll(msg);
      }
 
    } catch (IOException e) {
      // e.printStackTrace();
      System.out.println(ip + "下線了!");
      synchronized (list) {
        list.remove(socket);
      }
    }
  }
 
  /**
   * 把信息發送給所有的客戶端,去除當前socket
   *
   * @param msg
   *      發送的信息
   */
  private void sendToAll(String msg) {
    synchronized (list) {
      for (Socket s : list) {
        if (s != socket) {
          try {
            PrintStream ps = new PrintStream(s.getOutputStream());
            ps.println();
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
      }
    }
  }
 
}

--> 注意:因為要實現客戶端連接到服務端,即客戶端要先找到服務端,所以服務端要先開啟,再開啟服務端...

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美爱爱一区二区 | 成人免费av在线播放 | 最新中文字幕日本 | 成人精品久久久 | 2019中文字幕在线播放 | 色播一区 | 黄在线| 特大黑人videos与另类娇小 | av在线播放观看 | 男人久久天堂 | 一区二区久久精品66国产精品 | 少妇一级淫片高潮流水电影 | 精品1 | 夜夜夜操操操 | 毛片在线免费播放 | 亚洲精品一区国产精品丝瓜 | 国产精品成aⅴ人片在线观看 | 欧美wwwwww| 日本aaa一级片 | 19禁国产精品福利视频 | 一级毛片在线视频 | 天天操很很操 | 亚洲精品动漫在线观看 | 色综合久久久久久 | 92看片淫黄大片一级 | 日本一区二区在线 | 久久新地址 | 综合精品一区 | 国产一区二区视频在线播放 | 久色亚洲 | 一级毛片视频播放 | 国产日韩在线观看一区 | 日本成年免费网站 | 亚洲精品成人久久久 | wankzhd| 久草视频手机在线观看 | 成人免费av在线播放 | 小视频成人 | 羞羞羞羞视频 | 一级观看免费完整版视频 | 久久久久一区二区三区四区五区 |