Java Socket NIO (beta1)
在NIO的基礎上已經不能滿足我的需求,所以講BIO的Socket改爲之NIOBIO地址
封裝的服務器代碼
-
封裝類(SocketServer),並加了線程池
package com.server; import java.io.*; import java.net.*; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SocketServer { //創建一個線程池 ExecutorService executorService = Executors.newFixedThreadPool(100); //private String host; private int port; //private Socket socket; ServerSocket server; //Map<Integer,SocketThread> socketThreadMap; List<SocketThread> threads = new ArrayList<>(); int count = 0; public SocketServer(int port) { //this.host = host; this.port = port; } public void Connect() throws IOException { server = new ServerSocket(port); } public void Listener() throws IOException { while (true) { System.out.println("Start socket wait......"); Socket socket = server.accept(); //啓動線程 SocketThread socketThread = new SocketThread(socket); count++; socketThread.setName("Thread" + count); executorService.submit(socketThread); //自己定義的線程保存會造成阻塞 System.out.println("Bottom:" + count); threads.add(socketThread); System.out.println("listcount:" + threads.size()); } } public void SendMsg(String data) { } public void Close() throws IOException { //executorService. for (SocketThread item:threads) { item.Close(); } server.close(); } }
-
線程類
package com.server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Inet4Address; import java.net.InetAddress; import java.net.Socket; import java.net.SocketException; public class SocketThread extends Thread{ private Socket socket; private int byteLength = 1024; private InputStream inputStream; public SocketThread(Socket socket) { this.socket = socket; try{ this.socket.setKeepAlive(true); System.out.println("Client:" + this.socket.getInetAddress() + " Connected!"); }catch (SocketException e){ e.printStackTrace(); } } @Override public void run() { try { while (true) { if(!socket.isClosed()) { System.out.println(getName() + ":wait to read data!"); inputStream = socket.getInputStream(); byte[] bytes = new byte[byteLength]; int len = inputStream.read(bytes); StringBuilder sb = new StringBuilder(); if(len > 0){ sb.append(new String(bytes,0,len)); } System.out.println(getName() + " get data from:" +sb); //inputStream.close();//這裏調用會主動斷開與客戶端的連接 } } }catch (IOException e) { System.out.println(e.toString()); e.printStackTrace(); } Close(); } public void Close() { try { inputStream.close(); socket.close(); }catch (IOException e) { System.out.println(e.toString()); } } }
-
主函數調用測試
import com.server.SocketServer; import java.io.IOException; public class Main { public static void main(String[] args) { SocketServer server =new SocketServer(888); try{ server.Connect(); server.Listener(); server.Close(); }catch (IOException e){ System.out.println(e.toString()); } finally { return; } } }
測試
開了一個SocketTool2(需要的自己網上下載),創建了多個客戶端去連接服務器,可以同時發送信息,這些信息都會顯示
BUG
- 線程優雅關閉
- 資源釋放爲解決