繁体   English   中英

SocketException:尝试从Java中读取套接字时连接重置?

[英]SocketException: Connection Reset when trying to read from socket in Java?

在使用Java套接字时遇到了一些烦恼,我的应用程序似乎在一个非常基本的层面上失败了。 我的部分应用程序需要跨TCP连接编写文件名。 接收者代码如下:

ServerSocket serverSocket = new ServerSocket(4445); 
Socket socket = serverSocket.accept();      
BufferedReader reader = new BufferedReader(
            new InputStreamReader(socket.getInputStream()));
String filename = reader.readLine();

我的发件人代码如下:

    Socket socket = new Socket(InetAddress.getLocalHost(), 4445);
    PrintWriter writer = new PrintWriter(socket.getOutputStream());
    writer.write("Test.jpg");

非常非常基本的东西,但由于某种原因,我得到一个SocketException:连接重置当我运行它? 这是完整的堆栈跟踪:

Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at FileReceiver.main(FileReceiver.java:11)

FileReceiver.java:11行是reader.readLine()调用的行。 我不能为我的生活弄清楚出了什么问题,同样基本上使用TCP套接字过去一直对我有用,为什么现在这样呢?

接收方正在等待发送方永远不会发送的行尾。 在发送端尝试类似println()东西。

你的代码对我来说非常好......你忘记了添加

    writer.close();
    socket.close();

你的作家?

你需要结合尼克和尼古拉所说的内容:你需要用println编写(因为readLine期待行尾)你需要在关闭之前刷新你的编写器。

 Socket socket = new Socket(InetAddress.getLocalHost(), 4445);
 PrintWriter writer = new PrintWriter(socket.getOutputStream());
 writer.println("Test.jpg");
 writer.flush();

我建议在你尝试阅读之前刷新你的作家,在你尝试阅读它之前,有可能永远不会发送数据。

克里斯是对的。 当你正在使用printWriter或甚至像ObjectOutputStream(ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());)这样的序列化时 ,你需要调用.flush()函数,然后你必须关闭Writer和套接字。 您的解决方案如下:

 Socket socket = new Socket(InetAddress.getLocalHost(), 4445);
 PrintWriter writer = new PrintWriter(socket.getOutputStream());
 writer.println("Test.jpg");
 writer.flush();
 writer.close();
 socket.close();

下面是序列化的示例:(通过网络发送对象或将其保存到原始状态的文件以供将来复制)

    ...
ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(record);
oos.flush();
oos.close();
socket.close();

这是因为您的服务器退出了。 使用while循环发送。 看到这个 这里发生的事情是在客户端检索数据之前,服务器程序退出,以便重置连接,并在客户端抛出您看到的异常。

暂无
暂无

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

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