對學習過程當中本身敲的一些關於socket有關的代碼作了個簡單總結,在這分享一下,給有須要的同窗借鑑一下。java
什麼是socket?程序員
首先咱們先來完成socket服務端的代碼開發。編程
在服務端的main方法裏,咱們將socketserver對象設置成持久的,並綁定於本機的8899端口上,去接收客戶端的socket鏈接。服務器
package com.wenbing.socket; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.ServerSocket; import java.net.Socket; public class ServiceServer { public static void main(String[] args) throws Exception{ // 建立一個serversocket,綁定到本機的8899端口上 ServerSocket server = new ServerSocket(); server.bind(new InetSocketAddress("localhost", 8899)); // 接收客戶端的鏈接;accept是一個阻塞方法,會一直等待,到有客戶端請求鏈接才返回 while (true) { Socket socket = server.accept(); // 每一個socket請求都給一個線程來處理 new Thread(new ServiceServerTask(socket)).start(); } } }
package com.wenbing.socket; import java.io.*; import java.net.Socket; public class ServiceServerTask implements Runnable { Socket socket; InputStream inputStream = null; OutputStream outputStream = null; public ServiceServerTask(Socket socket) { this.socket = socket; } // 業務邏輯,跟客戶端進行數據交互 @Override public void run() { try { // 從socket鏈接中獲取到與client之間的網絡通訊輸入流 inputStream = socket.getInputStream(); // 從socket鏈接中獲取到與client之間的網絡通訊輸出流 outputStream = socket.getOutputStream(); // BufferedReader讀取數據是一個字符一個字符讀取,遇到回車即中止 BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); // 從網絡通訊輸入流中讀取客戶端發送過來的數據,讀取一行,遇到回車即結束 // 注意:socketinputstream的讀數據的方法是阻塞的 //讀取不少行數據,用while循環讀 // String line = ""; // String param = ""; // while (( line = br.readLine()) != null) { // param = br.readLine(); // System.out.println(param); // } String param = br.readLine(); System.out.println(param); GetDataServiceImpl getDataService = new GetDataServiceImpl(); String result = getDataService.getData(param); // 將調用結果寫到socket的輸出流中,以發送給客戶端 PrintWriter printWriter = new PrintWriter(outputStream); printWriter.println(result); printWriter.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { // 關流,如今是在每一個線程裏 inputStream.close(); outputStream.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
處理數據的方法。網絡
package com.wenbing.socket; public class GetDataServiceImpl { public String getData(String param) { return "OK-" + param; } }
接下來就是socket客戶端了。客戶端和服務端代碼基本相同。架構
package com.wenbing.socket; import java.io.*; import java.net.Socket; public class ServiceClient { public static void main(String[] args) throws Exception { // 向服務器發出請求創建鏈接 Socket socket = new Socket("localhost", 8899); // 從socket中獲取輸出流 InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); PrintWriter printWriter = new PrintWriter(outputStream); printWriter.println("hello"); printWriter.flush(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String result = bufferedReader.readLine(); System.out.println(result); inputStream.close(); outputStream.close(); socket.close(); } }
簡單的socket小例子,送給java小白們。socket
紙上得來終覺淺,絕知此事要躬行,必定要跟着敲一敲才更容易理解哦。ide