我最近刚学java,在看韩顺平讲java网络编程(项目是仿QQ)的时候,有个问题,他定义了客户端的静态socket,部分代码如下:
客户端:
public class QqClientConServer {
public static Socket s;
public boolean sendLoginInfoToServer(Object o)
{
.....
s=new Socket("127.0.0.1",9999);
}}
服务端:
public class MyQqServer {
public MyQqServer()
{try {ServerSocket ss=new ServerSocket(9999);
while(true)
{Socket s=ss.accept();}
客户端在发送的时候:ObjectInputStream ois=new ObjectInputStream(QqClientConServer.s.getInputStream());每个用户发送和接收都是这个s。
但是我在测试的时候发现每个客户端都和服务器端对应个socket,客户端绝不是一个socket。
但它又是通过静态共享s发送和接受的,这是怎么回事呢?有高手能解释下吗?

解决方案 »

  1.   

    service 通过 while 循环一直在检测呢,那个客户端连接了,他就获取哪个的socket,内部实现机制就是这样的,不必去深究原因,记住怎么用就可以了
      

  2.   


    ss.accept();这一句是一直到监听是否有客户端连接。(会一直阻塞)
    当有客户端连接上后,会创建一个Socket实例,一个客户端会对应一个Socket实例。
    而你说的那个s只不过是一个对象的引用。
      

  3.   

    没登录一个用户,客户端会重新创建一个socket实例,然后静态S就会指向这个socket,如果第二个用户登录,静态s就指向第二个socket,发送消息都必须通过静态s来发送,那么如果这时候第一个客户想发送消息,但是s已经是指向第二个客户端的socket了,第一个客户端是怎么发送的消息呢?
      

  4.   

    这个s只是一个引用啊,发送消息的时候,可以通过获取Socket的实例来判断啊。
      

  5.   

    起了两个客户端,就相当于启动了两个java虚拟机,实际上s是存在两个虚拟机中的静态变量,
      

  6.   

    我的意思是说,第一个客户端登录的时候用的socket是通过s的引用找到对应的socket发送的,第二个用户登录的时候,s已经存放的是第二个socket的引用,如果第一个用户要发送,是通过静态s的引用来找socket的,那么这个时候的s是存放的第二个客户端的socket,那么如何指向第一个socket呢?