2017-09-17 63 views
0

对连接单个服务器的多个客户端有疑问。这里是我的服务器端代码:多个客户端连接服务器java

//...  
ServerSocket serverSocket = null; 
     try{ 
      serverSocket = new ServerSocket(port); 
     }catch(IOException e){ 
      e.printStackTrace(); 
     } 
     Socket server = null; 

     while(true){ 
      try{ 
       server = serverSocket.accept(); 
       new createdThread(server).start(); //This is a thread class specified somewhere else to handle the socket. 
      }catch(IOException e){ 
       e.printStackTrace(); 
      } 

createdThread()是,将开始处理插座一个线程,它需要的Socket server作为参数。假设我有一个连接并启动一个线程,接受的套接字作为参数传递给线程。在这种情况下,如果我没有错,应该传递server作为参考。如果在第一个线程结束之前,serverSocket将获得一个新连接并创建一个新套接字,该套接字将更改server的值。这会影响第一个线程的执行,因为第一个线程将引用作为其参数,这意味着该引用的基础对象被更改了吗?

我测试了程序,它看起来运行良好。虽然它们的所有构造函数参数都是对同一个对象的引用,但每个线程并没有相互影响。这对我没有意义,并希望有人能够澄清。谢谢。

回答

1

当服务器对象传递给createdThread()方法时,会创建与其相同引用的第二个副本。看看“图1”here。所以当你改变循环内的服务器对象的值时,一个引用会丢失,但是第二个引用仍然存在于线程使用的方法内。

+0

第二*拷贝*的* *相同创建参考的。 – EJP

1

假设我有一个连接并启动一个线程,接受的套接字作为参数传递给线程。

按价值。换句话说,通过复制。

在这种情况下,如果我没有错,服务器应该作为参考传递。

至于Socket基准的

如果在第一个线程结束之前,serverSocket会创建一个新的连接并创建一个新的套接字,这将更改值server

正确。

没有也受此影响的第一个线程

以来的第一个线程执行为基准作为参数

没有它不“T。它将引用的作为它的参数,并且(可能)将其存储到另一个变量中。不是原来的server变量。

这意味着该引用的基础对象是否发生了变化?