问题描述
传统的Socket是阻塞的,这样的话服务器对每个Socket都需要建立一个线程来操作。请问这句话如何理解,前半句怎么解释?后半句跟前一句有何必然联系?
解决方案
“传统的Socket是阻塞的”意思是说:当服务器端执行到ServerSocket serverSocket = new ServerSocket(8888);Socket socket = serverSocket.accept();/*执行到这一句的时候,这一句下面的所有代码都不会执行,也就是说,此时阻塞了。意思就是说:服务器正在8888端口进行监听,如果没有客户端来请求,那么我就一直在这监听,直到客户端发送请求了,我才会执行下面的代码。那么什么时候客户端发送请求呢?*/当客户端执行Socket socket = new Socket("服务器地址",8888);//此时,就代表着客户端发送请求。那么这个时候,服务器端阻塞的下面的代码就可以顺利执行了。至于后半句:意思是说,一个socket相当于一条线路,在这一条线路上有两头,一头是客户端,一头是服务器端,所以通话的只有这两方,这两方就把当前的这一条线路(socket)占用了,其他的客户端要是想和服务器端通信,很显然,必须和服务器端再建立一条新的线路(socket),对不对?那么对于我们第一次建立的线路,在这条线路上保存着客户端和服务器端这两头的信息,如果要通信,我就要通过这一条线路(socket)来获得io,然后才能通信。对于第二条线路,他们要通信,就要在第二条线路建立相应的IO才可以。现在是两条线路了,我们都知道在正常模式下服务器端是单线程的,那么这两条线路是无法同时进行相应的IO操作的。但是如果要是把第一条线路(socket)用一个线程来操作,把第二条线路(socket)用另一个线程来操作。他们不就互不影响而且能同时运行了吗。所以:服务器对每个Socket都需要建立一个线程来操作如果还是不理解的话,我给你发一个小Demo邮箱:fatherican@sina.com
解决方案二:
个人的理解:引用传统的Socket是阻塞的就是服务器一直处于监听状态,等待客户端的请求。而服务器对每个Socket都需要建立一个线程来操作是指多个客户端请求时,每个请求都有一个单独的线程处理。