Java-->實現群聊功能(C/S模式--TCP協議),java----tcp

來源:互聯網
上載者:User

Java-->實現群聊功能(C/S模式--TCP協議),java----tcp

--> 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.