使用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();
}
}
發送之前的截圖
用戶端:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SM3ITM3QWZiZGM2kjM2ITNzYzX0UjMxcTMxIzLcBTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
服務端:
發送之後的截圖:
用戶端: