java網路程式設計基於TCP的多客戶端連線伺服器
阿新 • • 發佈:2019-01-05
package com.test.net; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; class TCPThreadServerSocket implements Runnable { private Socket socket = null; private InputStream in = null; private OutputStream out = null; public TCPThreadServerSocket(Socket s) { this.socket = s; } @Override public void run() { try { //獲取服務端輸入的訊息 in = socket.getInputStream(); //服務端返回的訊息 out = socket.getOutputStream(); //用一個位元組數字來存放訊息,提高效率 byte[] recData = new byte[1024]; in.read(recData); String data = new String(recData); System.out.println("讀取到客戶端傳送來的資料:" + data); //返回給客戶端的訊息 out.write("Hello client I am server".getBytes()); } catch (IOException e) { e.printStackTrace(); } finally { try { //關閉資源 in.close(); out.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } public class TCPThreadServer { private static final int PORT = 6666; public static void main(String[] args) { int count = 1; try { /** * 建立一個ServerSocket物件,並給它制定一個埠號, * 通過這個埠號來監聽客戶端的連線,服務端接受客戶端連線的請求是 * 不間斷地接受的,所以服務端的程式設計一般都永無休止的執行 */ ServerSocket ss = new ServerSocket(PORT); System.out.println("伺服器已經啟動。。。"); while (true) { /** * 在服務端呼叫accept()方法接受客戶端的連線物件,accept()方法是 * 一個阻塞式的方法,一直傻傻地等待著是否有客戶端申請連線 */ Socket s = ss.accept(); System.out.println("第" + count + "個連線,IP地址是:" + s.getInetAddress()); count++; /** * 服務端使用多執行緒方便多客戶端的連線 * 這裡將服務端的socket傳給內部類,方便每個客戶端都建立一個執行緒 */ Thread t = new Thread(new TCPThreadServerSocket(s)); t.start(); } } catch (IOException e) { e.printStackTrace(); } } }
二、客戶端A程式碼:
package com.test.net; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class TCPClientASocket { private static final int PORT = 6666; public static void main(String[] args) { Socket s = null; OutputStream out = null; InputStream in = null; DataOutputStream dos = null; DataInputStream dis = null; String serverHost = "127.0.0.1"; byte[] b = new byte[1024]; try { /** * 客戶端通過IP和埠和伺服器連線,連線上服務端後 * 就可以像服務端輸出訊息和接受服務端返回的訊息 * 通過IP就能找到一臺獨一無二的電腦終端,通過PORT找到 * 終端的某一個獨立的應用程式 */ s = new Socket(serverHost, PORT); out = s.getOutputStream(); dos = new DataOutputStream(out); dos.write("Hello Server I am client A".getBytes()); in = s.getInputStream(); dis = new DataInputStream(in); dis.read(b); String serverToClient = new String(b); System.out.println("服務端返回到客戶端的資訊:"+serverToClient); } catch (UnknownHostException e) { System.out.println("Host未知。。。"); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { //最後要關閉資源 out.close(); in.close(); dos.close(); dos.close(); s.close(); } catch (IOException e) { e.printStackTrace(); } } } }