国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

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

2019-11-26 13:56:14
字體:
來源:轉載
供稿:網友

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

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

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 類 定義客戶端向服務端發送信息的線程 

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 類 定義客戶端接收服務端信息的線程 

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 類定義服務端 

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

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();          }        }      }    }  }}

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海安县| 筠连县| 桃源县| 丰镇市| 中超| 宜阳县| 浦东新区| 梓潼县| 岳池县| 当涂县| 黄梅县| 文安县| 湘乡市| 屯留县| 和田市| 遂宁市| 高邑县| 平顺县| 华蓥市| 富顺县| 南雄市| 乐安县| 石城县| 平山县| 绵阳市| 城市| 南雄市| 陇南市| 松阳县| 台北县| 常州市| 梁山县| 蕉岭县| 册亨县| 井冈山市| 徐水县| 庆安县| 屏边| 奎屯市| 左贡县| 海丰县|