1. Socket 通信簡介及模型
Java Socket 可實現客戶端--服務器間的雙向實時通信。java.net包中定義的兩個類socket和ServerSocket,分別用來實現雙向連接的client和server端。

2. Socket 通信實現方法
2.1 服務器端(非多線程)
- 用指定的端口實例化一個SeverSocket對象。服務器就可以用這個端口監聽從客戶端發來的連接請求。
- 調用ServerSocket的accept()方法,以在等待連接期間造成阻塞,監聽連接從端口上發來的連接請求。
- 利用accept方法返回的客戶端的Socket對象,進行讀寫IO的操作
- 關閉打開的流和Socket對象
/**
* 基於TCP協議的Socket通信,實現用戶登錄,服務端
*/
//1、創建一個服務器端Socket,即ServerSocket,指定綁定的端口,並監聽此端口
ServerSocket serverSocket =newServerSocket(10086);//1024-65535的某個端口
//2、調用accept()方法開始監聽,等待客戶端的連接
Socket socket = serverSocket.accept();
//3、獲取輸入流,並讀取客戶端信息
InputStream is = socket.getInputStream();
InputStreamReader isr =newInputStreamReader(is);
BufferedReader br =newBufferedReader(isr);
String info =null;
while((info=br.readLine())!=null){
System.out.println("Hello,我是服務器,客戶端說:"+info);
}
socket.shutdownInput();//關閉輸入流
//4、獲取輸出流,響應客戶端的請求
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("Hello World!");
pw.flush();
//5、關閉資源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
2.2 客戶端
- 用服務器的IP地址和端口號實例化Socket對象。
- 調用connect方法,連接到服務器上。
- 獲得Socket上的流,把流封裝進BufferedReader/PrintWriter的實例,以進行讀寫
- 利用Socket提供的getInputStream和getOutputStream方法,通過IO流對象,向服務器發送數據流
- 關閉打開的流和Socket。
//客戶端
//1、創建客戶端Socket,指定服務器地址和端口
Socket socket =newSocket("127.0.0.1",10086);
//2、獲取輸出流,向服務器端發送信息
OutputStream os = socket.getOutputStream();//字節輸出流
PrintWriter pw =newPrintWriter(os);//將輸出流包裝成打印流
pw.write("用戶名:admin;密碼:admin");
pw.flush();
socket.shutdownOutput();
//3、獲取輸入流,並讀取服務器端的響應信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while((info=br.readLine())!null){
System.out.println("Hello,我是客戶端,服務器說:"+info);
}
//4、關閉資源
br.close();
is.close();
pw.close();
os.close();
socket.close();
2.2 服務器端 (多線程)
- 服務器端創建ServerSocket,循環調用accept()等待客戶端連接
- 客戶端創建一個socket並請求和服務器端連接
- 服務器端接受客戶端請求,創建socket與該客戶建立專線連接
- 建立連接的兩個socket在一個單獨的線程上對話
- 服務器端繼續等待新的連接
//服務器線程處理 和本線程相關的socket
Socket socket =null;
public serverThread(Socket socket){
this.socket = socket;
}
ServerSocket serverSocket =newServerSocket(10086);
Socket socket =null;
int count =0;//記錄客戶端的數量
while(true){
socket = serverScoket.accept();
ServerThread serverThread =newServerThread(socket);
serverThread.start();
count++;
System.out.println("客戶端連接的數量:"+count);
}
叄考資料:
http://developer.51cto.com/art/201509/490775.htm
http://blog.csdn.net/benweizhu/article/details/6615542/
