java - 套接字编程 : Client Disconnection keeps server hanging

标签 java c sockets server client

我正在尝试构建一个示例 TCP 转发器。以下是简要的功能:

  1. 转发器将在给定端口监听。
  2. 它包含客户端到服务器的映射
  3. 客户端将连接到转发器,转发器将查找 map 并创建双向转发连接。
  4. 为此,它为每个客户端创建了两个线程。
  5. 线程1:从客户端读取并写入目标服务器
  6. 线程2:从目标服务器读取并写入客户端。

所有这些都是用 C 语言编写的。 客户端和目标服务器可以用任何语言编写,现在是 Java。

当我第一次运行客户端时,它按预期工作。但是,如果我终止客户端并重新启动它,服务器将永远不会接收到新连接。

这是我怀疑有问题的服务器代码。

Socket clientSocket = serverSocket.accept();
InputStream inputStream = clientSocket.getInputStream();
OutputStream outputStream = clientSocket.getOutputStream();

while (true) {
    byte[] bArray = new byte[2048];
    try {
        System.out.println(String.format("SERVER:%s: Attempting to read", this.name));
        inputStream.read(bArray);
        System.out.println(String.format("SERVER:%s: Received %s", this.name, new String(bArray)));
        byte[] bytes = (name + ":" + counter).getBytes();
        counter++;
        outputStream.write(bytes);
        System.out.println(String.format("SERVER:%s: Sent %s", this.name, new String(bytes)));
    } catch (IOException e) {
        System.out.println(String.format("SERVER:%s: Client Disconnected ", this.name));
        clientSocket = serverSocket.accept();
        inputStream = clientSocket.getInputStream();
    }
}

在 C 程序中,我检测到断开连接并关闭套接字,如下所示:

LOGINFO("Reading from Client Socket.");
iResult = read(readSocket, buff, recvbuflen);
if (iResult <= 0) {
    LOGERROR("Receiving failed");
    close(readSocket);          
    break;
}

最佳答案

你应该使用

   shutdown(socket_fd, SHUT_WR);

代替 close(socket_fd) 以正确关闭套接字。

如果你使用 SHUT_WR,一个 FIN 数据包将被发送到另一端,通知他们我们没有更多的数据要发送。

关于java - 套接字编程 : Client Disconnection keeps server hanging,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50253920/

相关文章:

java - 将元素添加到数组中的下一个可用空间

java - 为什么 Log.i 在绘制时(位于 SquashCourtView 类下)在 drawCourt() 方法下不记录任何内容?

java - 超时后如何重新建立 JDBC 连接?

c - MPI C 中的发送和接收阵列

c - RtlGenRandom/CryptGenRandom 或其他 WinAPI 以生成加密安全随机数(2018 年第一季度)

java - 如何从绑定(bind)到 Android 父 Activity 的 fragment 访问服务功能?

c# - 嵌入式系统: Sockets vs MSMQ

java - 使用什么 cometd 配置来减少 402 错误的发生?

c++ - 在所有架构上 sizeof(float) 总是等于 sizeof(int) 吗?

python - Python 中套接字接收的习惯用法