程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java完成小型局域網群聊功效(C/S形式)

java完成小型局域網群聊功效(C/S形式)

編輯:關於JAVA

java完成小型局域網群聊功效(C/S形式)。本站提示廣大學習愛好者:(java完成小型局域網群聊功效(C/S形式))文章只能為提供參考,不一定能成為您想要的結果。以下是java完成小型局域網群聊功效(C/S形式)正文


本文實例為年夜家分享了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();
          }
        }
      }
    }
  }

}

--> 留意:由於要完成客戶端銜接到辦事端,即客戶端要先找到辦事端,所以辦事端要先開啟,再開啟辦事端...

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved