【问题标题】:Java ServerSocket connecting to same socket multiple timesJava ServerSocket 多次连接到同一个套接字
【发布时间】:2014-03-28 18:36:37
【问题描述】:

所以,我不确定问题出在哪里,但我正在尝试用 Java 创建一个简单的服务器,但是每当客户端连接时(我一直通过 Google Chrome 的 localhost 请求进行连接)一个客户端连接将连接多次。 (即,每次我通过浏览器连接到服务器时,服务器都会打印“用户连接成功”2-5 次。)我不确定主线程如何可能回到循环顶部并连接到同一个客户不止一次。

...
ServerSocket ss = new ServerSocket(9876);
while(true)
{
   Socket s = ss.accept();
   if(count >= queuesize || count >= numproducers)
   {
     System.out.println("Thread pool has reached it's limit. User access denied.");
     //....
     //error message sent to user here
     //....
   }
   else
   {
      System.out.println("User connected successfully");
      for(int x=0;x<numproducers;x++)
      {
         if(threads.get(position).isAvailable())
         {
             threads.get(x).start(s);
             position = (position+1) % numproducers;
             break;
         }
         position = (position+1) % numproducers;
      }
   }
}

【问题讨论】:

  • 如果您自己制作客户端,或者使用 Telnet 会发生这种情况吗?
  • 您是否考虑过 Chrome 可能会多次连接? (如果您使用的是 Linux,请使用 lsof 查看打开的连接。)
  • 也请分享客户端代码。
  • @MarkW 我只是在使用来自网络浏览器的请求。它似乎确实是某种http问题。使用 telnet 时,它只连接一次,但使用任何 Web 浏览器时,它会发送多个 GET 请求(我的服务器使用的是 http 请求)。有没有办法阻止服务器从同一个客户端接受多个 GET?
  • @vanza 我只是在使用来自网络浏览器的请求。它似乎确实是某种http问题。使用 telnet 时,它只连接一次,但使用任何 Web 浏览器时,它会发送多个 GET 请求(我的服务器使用的是 http 请求)。有没有办法阻止服务器从同一个客户端接受多个 GET?

标签: java sockets serversocket


【解决方案1】:

这是一种解决方法。它可能会帮助你。

  • 创建一个SetMap,其中包含来自下一行服务器的所有已连接Socket 的哈希码

    Socket s = ss.accept();
    
  • 现在每次有新客户端尝试连接时检查,如果它是相同的Socket,则什么也不做或关闭套接字。

【讨论】:

  • 我可能只是保留多个连接,因为我已经意识到它不会损害任何东西,但如果我决定不这样做,那么这似乎是一个很好的解决方案。谢谢! (我想过这样的事情,但我没想过用一套)
  • 不可能是同一个Socket。它总是一个新的套接字。答案没有意义,建议的解决方案毫无意义。
【解决方案2】:

我不确定主线程如何可能会回到循环顶部并多次连接到同一个客户端。

嗯:

  • 你有一个接受循环,它回答了部分问题,并且
  • 没有什么可以阻止浏览器与您建立多个连接

事情就这样发生了。

浏览器经常这样做以加载嵌入式资源,例如图像、样式表、JavaScript 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-16
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2017-04-26
    • 2018-03-16
    相关资源
    最近更新 更多