Java Socket BIO多线程 (beta1)
在BIO的基础上已经不能满足我的需求,所以讲BIO的Socket改为之BIO多线程
封装的服务器代码
-
封装类(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
- 线程优雅关闭
- 资源释放为解决