当前位置: 首页 > 知识库问答 >
问题:

服务器是否已为每个客户端进程打开套接字?

公孙胡媚
2023-03-14

我对插座感到困惑。据我所知,套接字是ip地址和端口号的组合。允许对流进行写入或读取(在TCP的情况下)只是编程抽象。现在我不能绝对确定的是,服务器在为客户端服务时,是有一个还是多个套接字?假设在端口80处为http

是否所有来自不同客户机的数据都被发送到一个套接字(服务器:80)和一些UBER服务器进程根据传入地址来区分它们,还是根据TCP层创建的客户机地址和端口号的组合来区分更多套接字?。有人能用一步一步的算法(对于同时服务的多个客户机)来详细描述这一点吗,而不仅仅是服务器将套接字绑定到端口,服务器监听套接字,服务器提供数据。

共有1个答案

通迪
2023-03-14

您混淆了TCP连接和套接字。套接字不是网络级的概念。Is是一个OS概念。TCP连接以(source-ip、source-port、dest-ip、dest-port)的唯一组合形式存在于网络上。套接字是打开端口或打开连接的句柄(此语句略有简化)。当我开始的时候,我也认为这是一个混乱和操作系统设计错误(但这是它是什么,我们坚持它)。设计错误是每个不同的套接字允许的操作非常不同。这些用例本应该是两个独立的概念,有不同的名称和不同的API。

正如您所看到的,套接字和连接之间没有1:1的关系。

有谁能用逐步算法把这个描述得很透彻吗

var openPortSocket = Open(80); //HTTP port
while(true) {
 var connectionSocket = openPortSocket.Accept();
 ServeConnectionOnNewThread(connectionSocket);
}

客户端必须为每个连接使用不同的客户端端口。这正是您的浏览器所做的。

 类似资料:
  • 编辑2:我切换到,并用包装客户端工厂,这样设备就可以很好地到达后端。但是当后端发回一些东西时,我会得到错误的出站套接字,客户机套接字死亡。我认为这是因为后端没有正确路由消息所必需的头。如何捕获此信息?我的配置类如下:

  • 我试图用java实现一个客户端服务器,在这里我读取客户端中的输入并在服务器中执行UperCase,然后返回客户端并打印UperCase。我使用ObjectOutputStream和ObjectInputStream进行读写,但是当我在客户机中键入一个msg时,程序会显示以下错误: Digite uma msg casa java.io.eofexception位于java.io.datainput

  • 我正在开发一个非常简单的Java客户机/服务器系统(只是为了让我的脚沾满套接字)。由于某种原因,我一直收到“套接字已关闭”错误。。。这是我的密码。。 服务器文件 客户端文件 我在客户端的第41行得到了错误,然后在第46行得到了NullPointerException。。 提前感谢您的帮助。我只是想在这里学习。

  • 如何处理多个客户端连接到一个服务器?我有这个logserver.java 和一个嵌入式applet,其中包含如下所示的部分代码,例如 现在的问题是,如果我在服务器上运行“Java日志服务器”,它将打开应用程序并等待输入流,如果我打开我的站点,它将开始流日志。但如果我使用其他计算机/网络再打开一个站点,第二个站点不会记录流。似乎是因为第一个仍然绑定到端口5000。 我该怎么处理?socket实际上是

  • 问题内容: 我必须使用Java的套接字API编写多线程客户端和服务器。客户端和服务器都是多线程的,因此服务器可以处理多个连接,客户端可以测试服务器处理连接的能力。 我的代码在这里:https : //github.com/sandyw/Simple-Java-Client- Server 我有几个可能是相关的问题。一,偶尔会有一个客户端线程抛出 从其位置来看,这意味着服务器在客户端完成从套接字读取

  • 我对套接字有点陌生,我正在尝试编写一个程序,在这个程序中,我基本上可以从客户端程序向服务器程序发送一些简单的请求。现在我只想在客户端有1或2个选项供用户选择。例如,如果用户在客户端选择“选项1”,那么服务器会返回一条消息“您选择选项1”,以此类推,但我不知道如何读取服务器上从客户端发送的输入。 客户代码: 服务器代码: 我需要在Clinet中使用两个不同的BufferedReader吗?一个用于用