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