Java網路程式設計--簡單的客戶端與服務端互動
阿新 • • 發佈:2020-11-20
一個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(); } }