Java Socket底層采用TCP/IP協議通信,通信細節被封裝,我們僅僅需要指定IP、端口,便能輕易地創建TCP或UDP連接,進行網絡通信。數據的讀寫,可以使用我們熟悉的stream進行操作。
TCP通信中,服務端與客戶端是一對多的關系,如下圖
Client發起連接請求后,Server端響應並創建一個Socket實例,與Client端一對一通信。通信完畢后,Client端與Server端的Socket實例各自關閉連接並銷毀,此次通信結束。
發起連接的三次握手和關閉連接的四次揮手過程暫且不表,后續文章詳細介紹。下面看具體代碼
服務端代碼
package com.coshaho.learn.socket; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; /** * SocketServer.java Create on 2017年12月16日 下午11:42:03 * 類功能說明: socket服務端 * @Author coshaho */ public class SocketServer { public static void main(String[] args) throws Exception { // 創建服務端 ServerSocket server = new ServerSocket(10000); // 服務端阻塞式監聽客戶端連接請求 // 接收到連接請求,則創建一個socket實例,與客戶端通信 Socket client = server.accept(); // 獲取InputStream讀取數據 InputStream in = client.getInputStream(); byte[] b = new byte[1024]; // 客戶端關閉輸出流后服務端會讀取到-1標志 while(-1 != in.read(b)) { System.out.println(new String(b)); } // 獲取OutputStream輸出數據 OutputStream out = client.getOutputStream(); out.write("hello, client".getBytes()); // 輸出結束,關閉輸出流 client.shutdownOutput(); System.out.println("Server close. " + System.currentTimeMillis()); server.close(); } }
客戶端代碼
package com.coshaho.learn.socket; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; /** * SocketClient.java Create on 2017年12月16日 下午11:42:53 * 類功能說明: socket客戶端 * @Author coshaho */ public class SocketClient { public static void main(String[] args) throws Exception { // 請求連接服務端,握手成功,返回Socket實例 Socket client = new Socket("127.0.0.1",10000); // 獲取輸入輸出流,讀寫數據(與服務端數據讀寫操作相同) InputStream in = client.getInputStream(); OutputStream out = client.getOutputStream(); out.write("hello, server".getBytes()); client.shutdownOutput(); byte[] b = new byte[1024]; while(-1 != in.read(b)) { System.out.println(new String(b)); } System.out.println("Client close. " + System.currentTimeMillis()); client.close(); } }