读书人

scoket创设多线程服务器

发布时间: 2012-12-22 12:05:06 作者: rapoo

scoket创建多线程服务器
这几天再看socket感觉收获还是蛮大的,以前对socket不太了解正好这一段时间可以好好地学习顺便整理一下以前的知识。

其他的前辈们都学如果做java没有接触过socket那就算没有学java 可见socket是相当重要的,更为可气的是我现在线程这一块的东西都没有怎么接触过,说来惭愧啊。。。

好了直接看demo

需求如下:现在我有一个socket 服务器 有N个客户端要连接这个服务器 那么我们如何处理这种情况。

分析如下:
当我们的server 接收到一个客户端的就会以客户端进行通信然后断开 关闭连接,然后接收下一个 ,加入有N多个客户端同时请求的话(也就是并发了)那么server 无法同时与多个客户端进行通信

解决方案:
第一: 我们使用多线程 每当有一个客户端与server连接的时候我们就启动一个线程 来处理该客户端的请求
第二: 我们使用线程池(这个分为两种情况 我们可以自己写线程池 也可以使用JDK 中的)

方案优劣评定:在代码后面在评定吧.

第一种方案 伪代码如下:

public void service()throws Exception{   while(true){       Socket socket = socketServer.accept();       Thread thread = new Thread(new Handler(socket));       thread.start();   }}class Handler implements Runnable{   private Socket socket;   public Handler(Socket socket){   this.socket = socket   }   public void run(){      //这里处理相应的逻辑   }}



第二种方案 伪代码如下:
 public class Server{    private ExecutorServer executorService;    private ServerSocket serverSocket;    public Server(){       serverSocket = new ServerSocket();       executorService = ExecutorService.newFixedThreadPool(5);    }    public void service()throws Exception{      while(true){       Socket socket = serverSocket.accept();       executorService.execute(new Handler(socket))       system.out.println("启动了服务器");      }    } }class Handler implements Runnable{   private Socket socket;   public Handler(Socket socket){   this.socket = socket   }   public void run(){      //这里处理相应的逻辑   }}


以上两种形式都能实现多线程下的 socket 服务,但是功能都能实现然而效率未必相同。

就第一种方案来讲:如果说客户端比较少的情况下服务器还是能支撑,但是在客户端很多的情况无论如何服务器如何优化,频繁的创建和销毁线程总是会占用很大的开销的。。

所以第一种方案我个人认为在大多数情况下不可行,如果其他看客有好的解决方案可以共享一下!

第二宗方案:多线程实现是基于JDK 下的线程池来实现的,我个人感觉不错(当然如果你认为自己能写出比java大师们写的更好的线程池的话 麻烦让我来拜读一下,,谢谢!) 他创建线程的个数是依赖于 服务器的cpu数 来创建的。。。。不过这里我们给他定死了。就是5个。。。这样做的好处是减少了系统频繁的创建和销毁线程占用的资源。。。


但是无论如何我始终认为 以上两种做法会有问题,第一种就不说了。。。至于第二种 我在想如果 我们创建了 N 多个线程,那么服务器端我们是通过队列来处理的,如果请求比较多 比较频繁的话队列里面怎么优化?

如果即使优化了那么还会出现线程阻塞么? 如果会,应该怎么解决?


读书人网 >编程

热点推荐