天天看點

【JAVA】使用Socket完成用戶端與服務端的雙向通信

                      使用Socket完成用戶端與服務端的雙向通信

有些公司面試中常常要求白闆程式設計,其中Socket程式設計是個出現頻率比較高的題目。在此記錄一下自己學習Socket程式設計的心得,做一個簡單的雙向通信的例子。

要求

用戶端發送資料,服務端回顯相同的資料。

服務端:

package day1106;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Socket之服務端
 */
public class Server {
    public static void main(String[] args) throws IOException {
        System.out.println("我是服務端");
        //監聽端口
        int port = 43438;
        ServerSocket serverSocket = new ServerSocket(port);
        //建立連接配接
        Socket socket = serverSocket.accept();

        //獲得用戶端傳來的資料
        InputStream inputStream = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = 0;
        StringBuilder sb = new StringBuilder();
        while ((len = inputStream.read(bytes)) != -1) {
            sb.append(new String(bytes, 0, len, "utf-8"));
            System.out.println("服務端正在從輸入流中讀資料");
        }
        System.out.println("服務端收到了:" + sb.toString());


        //接收到資料後,回顯收到的資料
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write(sb.toString().getBytes("utf-8"));

        inputStream.close();
        outputStream.close();
        socket.close();
        serverSocket.close();
    }
}      

用戶端:

package day1106;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * Socket之用戶端
 */
public class Client {
    public static void main(String[] args) throws IOException {
        System.out.println("我是用戶端");
        //指定目标主機ip與端口
        String host = "127.0.0.1";
        int port = 43438;
        Socket socket = new Socket(host, port);

        //想服務端發送資料
        OutputStream outputStream = socket.getOutputStream();
        //接收使用者輸入
        Scanner sc = new Scanner(System.in);
        String message = sc.nextLine();
        outputStream.write(message.getBytes("utf-8"));
        outputStream.flush();
        //終止發送資料,用戶端現在隻接收資料
        //如果不加shutdownOutput,伺服器端一直阻塞在read()方法中,導緻用戶端無法收到服務端回顯的資料
        //shutdownOutput隻關閉用戶端向服務端的輸出流,并不會關閉整個Socket的連接配接
        socket.shutdownOutput();

        //從服務端接收資料
        InputStream inputStream = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = 0;
        StringBuilder sb = new StringBuilder();
        while ((len = inputStream.read(bytes)) != -1) {
            sb.append(new String(bytes, 0, len, "utf-8"));
            System.out.println("用戶端正在從輸入流中讀資料");
        }
        System.out.println("來自服務端的回顯:" + sb.toString());

        //調用close方法,會直接關閉整個Socket連接配接
        outputStream.close();
        inputStream.close();
        socket.close();
    }
}      

發送之前的截圖

用戶端:

【JAVA】使用Socket完成用戶端與服務端的雙向通信

服務端:

【JAVA】使用Socket完成用戶端與服務端的雙向通信

發送之後的截圖:

用戶端: