可變資料長度的示例
Socket 服務端
public class SocketServer {
public static void main(String[] args) throws IOException {
//啟動socket服務端
ServerSocket server = new ServerSocket(8888);
while (true) {
//監聽用戶端請求
Socket socket = server.accept();
//實際開發中,應将下面的代碼放入到線程中執行。若用戶端同時發起多個socket請求時,會發生阻塞
//擷取用戶端請求資料
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
byte[] buff = new byte[4096];
int len;
while ((len = is.read(buff)) != -1) {
baos.write(buff, 0, len);
}
//輸出請求資料
System.out.println(baos.toString("utf-8"));
//根據實際業務需求,考慮是否需要響應給用戶端
OutputStream os = socket.getOutputStream();
os.write("ServerSocket的回複".getBytes("utf-8"));
socket.shutdownOutput(); //關閉資料輸出
socket.close(); //關閉目前用戶端通信,調用socket.close()會自動關閉輸入流和輸出流
}
//server.close(); //關閉socket服務端(停止服務)
}
}
Socket 用戶端
public class SocketClient {
public static void main(String args[]) throws UnknownHostException, IOException{
//連接配接socket服務端
Socket socket = new Socket("127.0.0.1", 8888);
//向服務端發送資料
OutputStream os = socket.getOutputStream();
os.write("我是一個中國人".getBytes("utf-8"));
socket.shutdownOutput(); //關閉資料輸出,若不關閉則服務端接收用戶端資料的輸入流會一直阻塞
//os.close(); //這裡不要調用close,否則socket連接配接就斷開了
//根據實際業務需求,考慮是否需要接收服務端響應
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
byte[] buff = new byte[4096];
int len;
while ((len = is.read(buff)) != -1) {
baos.write(buff, 0, len);
}
//輸出服務端響應資訊
System.out.println(baos.toString("utf-8"));
//關閉資源
socket.close(); //關閉與服務端的通信,并自動關閉輸入流和輸出流
}
}
固定長度的示例
Socket 服務端
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
while (true) {
Socket socket = server.accept();
//讀取用戶端請求資料,dis.read會阻塞,直到用戶端write資料後才能讀到資料
DataInputStream dis = new DataInputStream(socket.getInputStream());
byte[] buff = new byte[dis.readInt()]; //先讀取4個位元組的資料(int類型的資料占4個位元組),擷取真實資料長度
dis.read(buff); //讀取真實資料
System.out.println(new String(buff,"utf-8")); //輸出請求資料
//向用戶端響應資料
byte[] data = ("ServerSocket" + System.currentTimeMillis()).getBytes("utf-8");
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeInt(data.length); //先發送4個位元組的資料過去,告訴用戶端真實資料的長度為多少
dos.write(data); //發送真實資料
socket.close();
}
//server.close(); //關閉socket服務端(停止服務)
}
Socket 用戶端
public static void main(String args[]) throws UnknownHostException, IOException{
Socket socket = new Socket("127.0.0.1", 8888);
//向服務端發送資料
byte[] data = "我是一個中國人".getBytes("utf-8");
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeInt(data.length); //先發送4個位元組的資料過去(int類型的資料占4個位元組),告訴服務端真實資料的長度為多少
dos.write(data); //發送真實資料
//讀取伺服器響應的資料
DataInputStream dis = new DataInputStream(socket.getInputStream());
byte[] buff = new byte[dis.readInt()]; //先讀取4個位元組的資料,擷取真實資料長度
dis.read(buff); //讀取真實資料
System.out.println(new String(buff,"utf-8")); //輸出響應資料
socket.close();
}
參考資料:https://www.cnblogs.com/liuwenlin/p/10183652.html