在服务器端将数据写入 socket.getOutputStream 时会发生什么?

What happens when data is written to socket.getOutputStream on server side?

我对ServerSocket有疑问 客户:android 服务器:我的电脑静态IP 我在客户端使用套接字连接到服务器,服务器接受套接字并获取它的输入和输出流。 问题是当服务器将数据写入该输出流时,我无法理解客户端如何接收消息(我知道如何)。 如果是服务器向客户端发送数据的情况,考虑到客户端(android)没有可以通过互联网访问的 ip,怎么可能呢? 我知道长轮询,这里也使用这种方法吗?

任何连接到互联网的设备都有一个IP地址,所以你假设客户端(android ) 没有 IP 地址是 错误的 。此外,套接字连接将 持续 直到您明确关闭它或由于网络故障,因此一旦连接建立,服务器也可以在输出流上写入,客户端可以读取数据。

让我试着回答这个问题,当客户端没有 public 互联网地址时,服务器如何向客户端发送任何数据。

执行此操作的技术称为 Network address translation (NAT)

客户端创建套接字并使用该套接字向服务器发送请求。此请求首先发送到客户端的 Internet 网关并寻址到服务器。

Internet 网关通常是具有 public IP 地址的路由器。此路由器会记住客户端已向服务器发送数据,并将数据中 from 字段中的 IP 和端口替换为路由器的 IP。

现在数据包到达服务器,当服务器决定发送应答时,它会将其寻址到路由器 IP 和端口。

当数据包到达路由器时,它会查找与该端口关联的本地客户端,然后重写数据包中的端口和 IP 以匹配本地客户端。

然后将数据包发送给客户端。