繁体   English   中英

TCP 套接字写入错误

[英]TCP Socket write error

这个简单的 Java TCP 服务器/客户端示例有什么问题?

首先,启动服务器:

import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public static void main(String[] args) throws Throwable {
        ServerSocket ss = new ServerSocket(2345);
        Socket s = ss.accept();
        OutputStream os = s.getOutputStream();
        Thread.sleep(5000);
        for (int i = 0; i < 3; i++) {
            os.write("A".getBytes());
            os.flush();
            System.out.println("Written in cycle " + i);
        }
        os.close();
        s.close();

    }

}

之后启动客户端并观察服务器:

import java.net.Socket;

public class Client {

    public static void main(String[] args) throws Throwable{
        Socket s=new Socket("localhost",2345);
        s.close();
        System.out.println("Closed");
    }

}

客户端套接字立即关闭。 但是,服务器上的套接字写入操作在第二个循环中失败,即第一次写入没有抛出异常。

这是服务器的执行output:

Written in cycle 0
Exception in thread "main" java.net.SocketException: Software caused connection abort: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:124)
    at Server.main(Server.java:16)

您的客户端连接并立即关闭。 这被拒绝写入“无处”的服务器检测到。

以下链接与问题 100% 匹配,并解释了问题是什么以及如何解决它:

http://download.oracle.com/javase/1.5.0/docs/guide/net/articles/connection_release.html

因此,更具体地与上述代码相关,将 LINGER 设置为 0 将解决问题:

import java.net.Socket;

public class Client {

    public static void main(String[] args) throws Throwable {
        Socket s = new Socket("localhost", 2345);
        s.setSoLinger(true, 0);
        s.close();
    }

 }

当您写入套接字时,它必须将该数据传递给远程系统。 如果要等待远程系统等待确认每条数据,它会慢很多倍。 无论如何,这不是 TCP 的工作方式。

如果您需要远程套接字来确认它已收到您的数据,您需要添加您自己的协议以确保您发送的每条数据都已收到。

从评论中复制,因为它回答了您的问题。

客户端套接字是否必须做一些事情来接收来自服务器的输出流? 也许我只是遗漏了一些东西,所以如果我错了请纠正我,但是为什么在创建客户端套接字后立即关闭它? 这就是问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM