天天看點

Java Socket 示例代碼

可變資料長度的示例

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

繼續閱讀