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/