java - 当数据写入服务器端的socket.getOutputStream时会发生什么?

标签 java sockets networking serversocket

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

最佳答案

让我尝试回答以下问题:当客户端没有公共(public)互联网地址时,服务器如何向客户端发送任何数据。

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

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

互联网网关通常是具有公共(public) IP 地址的路由器。该路由器会记住客户端已向服务器发送了数据,并将数据中from字段中的IP和Port替换为路由器的IP。

现在数据包到达服务器,当服务器决定发送答案时,它将把它发送到路由器的 IP 和端口。

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

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

关于java - 当数据写入服务器端的socket.getOutputStream时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59489140/

相关文章:

Java - 初始化没有泛型类型的泛型变量;

c - 选择始终返回数据

c - 服务器客户端程序未定义行为

c++ - 通过网络构建和发送二进制数据

c# - 从 C# 获取无线接入点的 BSSID(MAC 地址)

java - 如何在 Android 中获取 WiFi 噪音水平?

java - 如何使用外键类型从 jpa 存储库返回选择查询

java - 具有多个文本和图像的 ListView

sockets - Ada/C/++ 分布式应用程序

java - 预测 Java 应用程序产生的网络流量开销