天天看點

Java Socket通信

1 . 伺服器端

public class Server {
    public static void main(String[] args) {
        
        try {
            // 1. 綁定端口,并監聽此端口
            ServerSocket serverSocket = new ServerSocket(6000);
            System.out.println("伺服器啟動成功...");
            
            // 2. 調用accept()方法開始監聽,等待用戶端的連結
            // 使accept()阻塞等待用戶端請求,有客戶請求到來則産生一個Socket對象,并繼續執行
            Socket socket = serverSocket.accept();
            
            // 3. 擷取輸入流,并調取用戶端資訊            
            // 由socket對象得到輸入流,并構造相應的BufferedReader對象
            String line;
            InputStream inputStream = socket.getInputStream();
            BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
            
            // 4. 由socket對象得到輸出流,并構造PrintWriter對象
            PrintWriter writer = new PrintWriter(socket.getOutputStream());
            
            // 5. 由系統的标準輸入裝置構造BufferedReader對象
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            
            // 6. 從标準輸入列印從用戶端度讀入的字元串
            line = br.readLine();
            
            while(!line.endsWith("end")){
                writer.println(line);
                writer.flush();
                System.out.println("Server: " + line);
                System.out.println("Client: " + in.readLine());
                line = br.readLine();
            }
            
            // 7. 釋放
            writer.close();
            in.close();
            socket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("伺服器啟動失敗...");
        }
    }
}

           
  1. 用戶端
public class Client {
    public static void main(String[] args) {
        try {
            // 1. 建立用戶端Socket,指定伺服器位址和端口
            Socket socket = new Socket("127.0.0.1", 6000);
            System.out.println("用戶端啟動成功...");
            // 2. 擷取輸出流, 向伺服器發送消息
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            PrintWriter writer = new PrintWriter(socket.getOutputStream());
            // 3. 擷取輸入流,并讀取伺服器端的響應資訊
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String readLine;
            readLine = br.readLine();
            while(!readLine.equals("end")){
                writer.println(readLine);
                writer.flush();
                System.out.println("Client: " + readLine);
                System.out.println("Server: " + in.readLine());
                readLine = br.readLine();
            }
            
            // 4. 釋放資源
            writer.close();
            in.close();
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
            System.out.println("未知主機");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("用戶端啟動失敗");
        }
        
    }
}

           
  1. 運作時首先開啟伺服器端,再打開用戶端。在用戶端控制台中輸入消息,接下來在伺服器端控制台數輸入消息,可以看到用戶端發送的消息。