Socket是使用TCP協議,此協議發送資料前會建立串連,保證資料的可靠性,
下面是個用戶端和伺服器端Socket通訊 的模版:
package demo;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;//伺服器接收到一個Socket後啟動一個線程處理資料轉送public class SocketThread extends Thread{ private Socket s; public SocketThread(Socket s) { // TODO Auto-generated constructor stub this.s=s; } @Override public void run() { try { OutputStreamWriter outw=new OutputStreamWriter(s.getOutputStream()); PrintWriter pw=new PrintWriter(outw); pw.write("welcome:I am server"); pw.close(); outw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
package demo;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;//伺服器端啟動一個ServerSocket,使用accept()迴圈監聽用戶端請求:public class Servermain { public static void main(String[] args){ try { ServerSocket server=new ServerSocket(8080); Socket socket; //服務端迴圈監聽 while((socket=server.accept())!=null){ //接收到串連,啟動一個線程處理 new SocketThread(socket).start(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
package demo;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.Socket;import java.net.UnknownHostException;//用戶端串連public class ClientMain { public static void main(String[] args) { // TODO Auto-generated method stub Socket c; try { for (int i = 0; i < 5; i++) { c = new Socket("localhost",8080); InputStreamReader inr=new InputStreamReader(c.getInputStream()); BufferedReader br=new BufferedReader(inr); System.out.println(br.readLine()); br.close(); inr.close(); } } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
啟動順序是先啟動伺服器,然後啟動用戶端進行串連。此例中有5個用戶端進行串連。效果截圖: