Java Socket程式設計 標準範例(多執行緒)
阿新 • • 發佈:2019-02-07
伺服器端(Server)非多執行緒
package com.zeph.serverclient; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class MyServer { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(5678); Socket client = server.accept(); BufferedReader in = new BufferedReader(new InputStreamReader( client.getInputStream())); PrintWriter out = new PrintWriter(client.getOutputStream()); while (true) { String str = in.readLine(); System.out.println(str); out.println("has receive...."); out.flush(); if (str.equals("end")) break; } client.close(); } }
客戶端(Client)
package com.zeph.serverclient; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; public class MyClient { static Socket server; public static void main(String[] args) throws Exception { server = new Socket(InetAddress.getLocalHost(), 5678); BufferedReader in = new BufferedReader(new InputStreamReader( server.getInputStream())); PrintWriter out = new PrintWriter(server.getOutputStream()); BufferedReader wt = new BufferedReader(new InputStreamReader(System.in)); while (true) { String str = wt.readLine(); out.println(str); out.flush(); if (str.equals("end")) { break; } System.out.println(in.readLine()); } server.close(); } }
伺服器端(Server)多執行緒
package com.zeph.multiclient; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class MultiClient extends Thread { private Socket client; public MultiClient(Socket c) { this.client = c; } public void run() { try { BufferedReader in = new BufferedReader(new InputStreamReader( client.getInputStream())); PrintWriter out = new PrintWriter(client.getOutputStream()); // Mutil User but can't parallel while (true) { String str = in.readLine(); System.out.println(str); out.println("has receive...."); out.flush(); if (str.equals("end")) break; } client.close(); } catch (IOException ex) { } finally { } } public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(5678); while (true) { // transfer location change Single User or Multi User MultiClient mc = new MultiClient(server.accept()); mc.start(); } } }
測試這個程式碼的時候可以直接用DOS控制檯上面執行,這樣看的效果更清楚!
伺服器基本步驟:
1.指定埠例項化一個SeverSocket
2.呼叫ServerSocket的accept()方法,以在等待連線期間造成阻塞
3.獲取位於該底層的Socket的流以進行讀寫操作
4.將資料封裝成流
5.對Socket進行讀寫
6.關閉開啟的流
客戶端基本步驟:
1.通過IP地址和埠例項化Socket,請求連線伺服器
2.獲得Socket上的流以進行讀寫
3.把流封裝進BufferedReader/PrintWriter的例項
4.對Socket進行讀寫
5.關閉開啟的流