Java網路 伺服器與客戶端的簡單通訊
阿新 • • 發佈:2018-12-27
不登高山,不知天之高也。不臨深淵,不知地之厚也。
Java中的封裝類(Socket),在實現這個功能的時候,需要對Java中的Socket套接字的一些用法熟悉,伺服器與客戶端之間主要通過的Java中的IO流通訊。需要理解IO流的流出,流入問題。
接下來,之間看程式碼了,在客戶端加入了多執行緒操作。自己定義了一多執行緒的工廠。
伺服器
public class Server1 extends Socket { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(5000);//開啟伺服器,埠為5000.個人伺服器建議4位數,防止佔用其他埠 System.out.println("伺服器已啟動,等待連線"); //自己建立一個執行緒工廠,以下是各種引數 // corePoolSize 核心執行緒數 // maxPoolSize 最大執行緒數 核心執行緒數+救急執行緒數<=最大執行緒數 // keepAliveTime 保持時間 如果一個執行緒閒暇的時間超過了保持時間,那就把它回收,但不會少於核心執行緒數 // timeUnit 時間單位 // BlockingQueue 阻塞佇列 當任務數超過核心執行緒數後,就把任務放入阻塞佇列排隊執行 (有界,無界) // ExecutorService service = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS, // new ArrayBlockingQueue<>(10)); ExecutorService service = new ThreadPoolExecutor(10, 10, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); while (true){ Socket accept = serverSocket.accept();//等待客戶端的連線 System.out.println("已連線……"); service.submit(()->{//lambda 表示式 // 把io相關的操作放線上程內執行,讓每個執行緒處理一個io操作,避免io阻塞 try { getStream(accept); } catch (IOException e) { e.printStackTrace(); } }); } } private static void getStream(Socket accept) throws IOException { InputStream in = accept.getInputStream();//得到客戶端的位元組流 OutputStream out = accept.getOutputStream();//要給客戶的位元組流 while (true){ byte[] bytes = new byte[1024]; int len = in.read(bytes); if(len == -1){ break; } String ins = new String(bytes, 0, len, "utf-8"); System.out.println(ins); out.write(("伺服器回答"+ins).getBytes("utf-8"));//返回給客戶端 } } }
接下來,看客戶端的程式碼,客戶端實現的是,可以在客戶端寫入資料,實時的顯示在伺服器端。
多個客戶對應一個客戶端。
客戶端
public class Client extends Socket { public static void main(String[] args) throws IOException { Socket socket = new Socket("localhost", 5000);//連線本地伺服器 InputStream in = socket.getInputStream();//得到伺服器傳過來的位元組流 OutputStream out = socket.getOutputStream();//要給伺服器傳的位元組流 out.write("Helli".getBytes());//給伺服器一個Hello new Thread(new Runnable() { @Override public void run() { Scanner scanner = new Scanner(System.in); if (scanner.hasNextLine()){//判斷是否有下一行 String line = scanner.nextLine();//有就繼續輸出給服務端 try { out.write(line.getBytes()); } catch (IOException e) { e.printStackTrace(); } } } }).start(); while (true){ byte[] bytes = new byte[1024]; int len = in.read(bytes); if(len == -1){ break; } //讀取伺服器的位元組流 String result = new String(bytes,0,len,"utf-8"); //返回給伺服器 out.write(("Hello"+result).getBytes("utf-8")); } } }