通過java socket通訊(一) 入門示例,就可以實現服務端和客戶端的socket通訊,但是上一個例子只能實現一個服務端和一個客戶端之間的通訊,如果有多個客戶端連接服務端,則需要通過多線程技術來實現。
服務器端----------------------------------------------------------------------------------------------------------------------------------------
socketServer:
package test; import java.net.ServerSocket; import java.net.Socket; public class socketServer { public static void main(String [] args){ ServerSocket ss = null; Socket sk = null; try{ System.out.println("create server socket...."); ss = new ServerSocket(3756); System.out.println("wait for a connection...."); while(true) //服務器端一直監聽這個端口,等待客戶端的連接 { sk = ss.accept(); //當有客戶端連接時,產生阻塞 System.out.println("get a socket object..."); new socketThread(sk).start();//新建一個socketThread處理這個客戶端的socket連接 } } catch(Exception ex){ System.out.println(ex.getMessage()); } finally{ try{ if(ss != null){ ss.close(); } if(sk != null){ sk.close(); } } catch(Exception ex){ System.out.println(ex.getMessage()); } } } }
socketThread:
package test; import java.io.BufferedWriter; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.util.*; public class socketThread extends Thread { public Socket socket; public socketThread(Socket socket) { this.socket = socket; } public void run() { PrintWriter pw = null; Calendar c; try { pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))); while(true)//服務器每隔3秒向客戶端發送當前時間信息 { Thread.sleep(3000); c = Calendar.getInstance(); //獲取當前時間 pw.println("Server Time:"+c.getTime().toString()); pw.flush(); } } catch (Exception ex) { System.out.println(ex.getMessage()); } finally { try { if (pw != null) { pw.close(); } if (socket != null) { socket.close(); } } catch (Exception ex) { System.out.println(ex.getMessage()); } } } }
客戶端----------------------------------------------------------------------------------------------------------------------------------------
socketClient:
package test; import java.io.PrintWriter; import java.net.Socket; import java.io.InputStreamReader; import java.io.BufferedReader; public class socketClient { public static void main(String[] args) { Socket sk = null; BufferedReader br = null; try { sk = new Socket("localhost", 3756); br = new BufferedReader(new InputStreamReader(sk.getInputStream())); String line = null; while((line = br.readLine()) != null){ System.out.println("Msg from server:"+line); //服務器端打印客戶端發送的信息數據 } } catch (Exception ex) { System.out.println(ex.getMessage()); } finally { try { if (sk != null) { sk.close(); } if (br != null) { br.close(); } } catch (Exception ex) { System.out.println(ex.getMessage()); } } } }
服務端啟動后,就會監聽3756端口,每當有一個客戶端請求時,就會新建一個socketThread來和客戶端進行通訊(每隔3秒鍾將服務端的時間發送到客戶端)