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

时间:2011-11-22 14:24:53

标签: java sockets tcp

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套接字过去一直对我有用,为什么现在这样呢?

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

给你的作家?

答案 2 :(得分:2)

你需要结合Nick和Nikolai所说的话: 你需要用println编写(因为readLine期望行结束),你需要在关闭它之前刷新你的编写器。

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

答案 3 :(得分:1)

我建议在您尝试阅读之前刷新您的作者,在您尝试阅读之前,数据可能永远不会被发送。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

克里斯是对的。当您正在使用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();