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

來源:互聯網
上載者:User

本文執行個體為大家分享了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();          }        }      }    }  }}

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

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.