1. 程式人生 > 實用技巧 >Java網路程式設計--簡單的客戶端與服務端互動

Java網路程式設計--簡單的客戶端與服務端互動

一個Socket初級應用的例子

這裡寫一個用socket模擬的服務端-客戶端文字互動的小程式。Java網路程式設計會再開一文(依舊是《Java Core》學習筆記)

程式碼

伺服器端程式碼

這裡我為了讓服務端可以接收多個客戶端請求,所以服務端的處理程式碼寫線上程中

class Server implements Runnable {

    private final Socket socket;  //傳入ServerSocket.accept()返回的Socket,即服務端Socket
    private final String serverName;
    private SharedData shareData; //沒用,之前想的是服務端利用共享資料實現廣播功能,但是應該不能這麼做
    private static final int CHUNK = 1024; //讀寫的大小單位

    public Server(Socket socket, String serverName, SharedData shareData) {
        this.socket = socket;
        this.serverName = serverName;
        this.shareData = shareData;
    }

    @Override
    public void run() {
        try (BufferedInputStream receive = new BufferedInputStream(socket.getInputStream());
             BufferedOutputStream send = new BufferedOutputStream(socket.getOutputStream());
             Scanner scanner = new Scanner(System.in)) {
            byte[] receiveData = new byte[CHUNK];
            int size;
            while ((size = receive.read(receiveData)) != -1) {
                byte[] trimData = Arrays.copyOf(receiveData, size);
                System.out.printf("伺服器%s接收到訊息-->%s\n", this.serverName,
                        new String(trimData, StandardCharsets.UTF_8));

                while (scanner.hasNext()) {
                    send.write(scanner.next().getBytes(StandardCharsets.UTF_8));
                    send.flush();
                    break;
                }
            }

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

    public String getServerName() {
        return serverName;
    }
}

客戶端程式碼

客戶端的程式碼可以不寫線上程裡,用程序直接模擬即可。之後要學習一下客戶端之間怎麼通過服務端進行互動

class Client implements Runnable {

    private final String serverHost;
    private final int serverPort;
    private final String clientName;
    private static final int CHUNK = 1024;

    public Client(String serverHost, int serverPort, String clientName) {
        this.serverHost = serverHost;
        this.serverPort = serverPort;
        this.clientName = clientName;
    }

    @Override
    public void run() {
        try (Socket socket = new Socket(serverHost, serverPort);
             BufferedOutputStream send = new BufferedOutputStream(socket.getOutputStream());
             BufferedInputStream receive = new BufferedInputStream(socket.getInputStream());
             Scanner scanner = new Scanner(System.in)) {
            while (scanner.hasNext()) {
                send.write(scanner.next().getBytes(StandardCharsets.UTF_8));
                send.flush();

                byte[] receiveData = new byte[CHUNK];
                int size = receive.read(receiveData);
                System.out.printf("客戶端%s收到訊息-->%s\n", this.clientName,
                        new String(Arrays.copyOf(receiveData, size), StandardCharsets.UTF_8));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public String getClientName() {
        return clientName;
    }
}

啟動程式碼

public class ServerLauncher {

    static final int PORT = 8888;
    static final int TEXT_CHUNK_SIZE = 1024 * 1024;

    public static void main(String[] args) {

        int count = 1;
        byte[] shareData = new byte[TEXT_CHUNK_SIZE];
        SharedData sharedData = new SharedData(shareData);

        try (ServerSocket serverSocket = new ServerSocket(PORT)) {
            for (;;) {
                System.out.printf("第%d個Server已經啟動,等待連線中...\n", count);
                Server server = new Server(serverSocket.accept(), "Server" + count, sharedData);
                Thread t = new Thread(server);
                t.setName(server.getServerName());
                t.start();
                System.out.printf("第%d個Client連線成功!\n", count++);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public class ClientLauncher {

    static final String IP = "127.0.0.1";
    static final int PORT = 8888;

    public static void main(String[] args) {
        Client client = new Client(IP, PORT, "client");
        Thread t = new Thread(client);
        t.setName(client.getClientName());
        t.start();
    }
}