Java網絡編程C/S模型

支持多個客戶端連接服務器:添加java文件在main函數調用new一個新的客戶端

服務器支持羣發和私聊信息:羣發直接發送就行,私聊在消息前加上客戶端端口號+“:”,如“49761:你好啊”

客戶端:

package CS;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

public class Client {

    Socket socket;

    //構造函數1
    public Client(String ip, int port) throws IOException {
        socket = new Socket(ip, port);
    }

    //構造函數2
    public Client(InetAddress inetAddress, int port) throws IOException {
        socket = new Socket(inetAddress, port);
    }

    //連接服務器
    public void connect() throws IOException {
        new ClientSend(socket).start();
        new ClientReceived(socket).start();
    }

    //客戶端發送消息線程
    class ClientSend extends Thread{
        Socket socket;
        public ClientSend(Socket socket) throws IOException {
            this.socket = socket;
        }
        public void run() {
            try{
                Writer serverWriter;//服務端輸出字符流(用於給服務器發消息)
                serverWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                Scanner scanner = new Scanner(System.in);
                while(true){
                    String str = scanner.next();
                    if("close".equals(str)) {
                        socket.shutdownOutput();
                        socket.shutdownInput();
                        socket.close();
                        break;
                    }
                    serverWriter.write(str);
                    serverWriter.flush();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //客戶端接受消息線程
    class ClientReceived extends Thread{
        Socket socket;
        public ClientReceived(Socket socket) throws IOException {
            this.socket = socket;
        }
        public void run() {
            try {
                Reader reader = new InputStreamReader(socket.getInputStream());
                char[] chars = new char[1024];
                int len = 0;
                while((len = reader.read(chars))!=-1) {
                    String str = new String(chars,0,len);
                    if (str != null) System.out.println("服務器端:" + str);
                }
            } catch (IOException e) {
                System.out.println("服務器已斷開");
            }
        }
    }

    //main函數
    public static void main(String[] args) throws IOException {
        Client client = new Client("127.0.0.1",3333);
        client.connect();
    }
}


服務器:

package CS;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Server {

    ServerSocket serverSocket;
    //連接的客戶端
    List<Socket> list;

    public Server(int port) throws IOException {
        serverSocket = new ServerSocket(port);
        list = new ArrayList<>();
    }

    //服務器初始化
    public void init(){
        new Connection().start();//連接線程啓動監聽
        new ServerSend().start();//消息發送線程啓動
    }

    //接受客戶端連接請求線程
    class Connection extends Thread{
        @Override
        public void run() {
            while(true){
                try {
                    Socket socket = serverSocket.accept();
                    System.out.println(socket.getRemoteSocketAddress()+"已連接");
                    list.add(socket);
                    new ServerReceived(socket).start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //服務器發送消息線程
    class ServerSend extends Thread{
        public void run() {
            try {
                Scanner scanner = new Scanner(System.in);
                while(true){
                    String str = scanner.next();
                    //羣發消息
                    if(!str.contains(":")) {
                        for(Socket socket :list) {
                            if (socket.isConnected()&&!socket.isClosed()) {
                                Writer clientWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                                clientWriter.write(str);
                                clientWriter.flush();
                            }
                        }
                    }
                    //私聊
                    else{
                        String[] strs = str.split(":");
                        String portStr = strs[0];
                        String info = strs[1];
                        for(Socket socket :list) {
                            if(socket.getRemoteSocketAddress().toString().split(":")[1].equals(portStr)){
                                if (socket.isConnected()&&!socket.isClosed()) {
                                    Writer clientWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                                    clientWriter.write(info);
                                    clientWriter.flush();
                                }else{
                                    System.out.println("該客戶端已關閉或斷開連接");
                                }
                                break;
                            }
                        }

                    }


                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //服務器接受消息線程
    class ServerReceived extends Thread{
        Socket client;
        public ServerReceived(Socket socket){
            this.client = socket;
        }
        public void run() {
            try{
                Reader reader = new InputStreamReader(client.getInputStream());
                char[] chars = new char[1024];
                int len = 0;
                while ((len = reader.read(chars))!= -1) {
                    String str = new String(chars, 0, len);
                    System.out.println("客戶端"+client.getRemoteSocketAddress()+":"+ str);
                }
            } catch (IOException e) {
                System.out.println(client.getRemoteSocketAddress()+"已斷開");
            }
        }
    }

    //main函數
    public static void main(String[] args) throws IOException {
        Server server = new Server(3333);
        server.init();
    }
}

再添加一個客戶端:

package CS;
import java.io.IOException;
public class Client1 {
    public static void main(String[] args) throws IOException {
        Client client = new Client("127.0.0.1",3333);
        client.connect();
    }
}

運行效果:

目前啓動了一個服務器和兩個客戶端,綠色字體是本端輸入

服務器端:
在這裏插入圖片描述
客戶端49761:
在這裏插入圖片描述
客戶端49787:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章