多个客户端连接服务器java

时间:2017-09-17 04:26:24

标签: java multithreading sockets reference

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

//...    
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的值。这会影响第一个线程的执行,因为第一个线程将引用作为参数,这意味着该引用的底层对象被更改了吗?

我测试了程序,看起来效果很好。每个线程都不会相互影响,尽管它们的所有构造函数参数都是对同一对象的引用。这对我来说没有意义,希望有人能澄清一下。谢谢。

2 个答案:

答案 0 :(得分:1)

当服务器对象传递给createdThread()方法时,会创建对它的相同引用的第二个副本。看看“图1”http://jsfiddle.net/wb7eqbnj/。因此,当你在循环中更改服务器对象的值时,一个引用会丢失,但第二个引用仍然存在于线程使用的方法中。

答案 1 :(得分:1)

  

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

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

  

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

作为对Socket的引用的

  

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

正确。

  

否它是否会影响第一个线程的执行

没有

  

因为第一个线程将引用作为其参数

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

  

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

没有