gpt4 book ai didi

Java 服务器连接重置

转载 作者:行者123 更新时间:2023-12-01 22:32:36 24 4
gpt4 key购买 nike

一段时间以来,我一直在尝试解决简单的 java 服务器-客户端程序中的“连接重置”问题。

我的场景是这样的

客户端程序将文件名作为输入,然后将其发送到服务器程序。服务器将检查该目录中是否存在该文件。如果存在则服务器将打印“ok”,否则“文件未找到”

我收到此执行java.net.SocketException:连接重置

服务器程序

package tcpserver;
import java.net.*;
import java.io.*;

public class TCPServer {

ServerSocket serversocket;
Socket socket;
BufferedReader buffread, buffout;

String filename;
String strDir = "D:\";

private void findFile(String name) {

File fileObj = new File(strDir);
File[] fileList = fileObj.listFiles();
if (fileList != null) {
for (File indexFile : fileList) {
if (name.equalsIgnoreCase(indexFile.getName())) {
System.out.println("200 ok ");
} else {
System.out.println("File Not found");
}
}
}
}

public TCPServer() {
try {
//creating server object
serversocket = new ServerSocket(6666);
socket = serversocket.accept();
//get input stream through the socket object from buffer
buffread = new BufferedReader(new InputStreamReader(socket.getInputStream()));

filename = buffread.readLine();
findFile(filename);
} catch (IOException ex) {
//System.err.println(ex);
ex.printStackTrace();
}
}

public static void main(String[] args) {
TCPServer serverObject = new TCPServer();
}
}

客户端程序

package tcpclient;

import java.net.*;
import java.io.*;

public class TCPClient {

BufferedReader bffread, bffinput;
String fileInput;

public TCPClient() {
try {
//Creating socket
Socket socket = new Socket("localhost", 6666);
System.out.println("Enter filename");
bffinput = new BufferedReader(new InputStreamReader(System.in));
OutputStream outputObject = socket.getOutputStream();

} catch (Exception ex) {
System.out.println("Unhandled exception caught");
}
}

public static void main(String[] args) {
TCPClient clientObject = new TCPClient();
}
}

异常堆栈

java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:189)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at tcpserver.TCPServer.<init>(TCPServer.java:38)
at tcpserver.TCPServer.main(TCPServer.java:47)*

如有任何帮助/建议,我们将不胜感激。提前致谢

最佳答案

您的服务器接受连接,但从不发回任何内容。 “200 OK”消息被写入标准输出,而不是套接字。然后服务器终止,关闭连接。此时,仍在等待数据的客户端收到异常。

我猜你想向客户端发送“200 OK”。因此,您必须将套接字或至少套接字的 OutputStream 传递给 findFile(),并将响应写入其中。

或者,更干净一点:从 findFile() 返回响应字符串,并在调用方法中发送它,因此 findFile() 甚至不需要知道发送响应。

您还应该在打开套接字的 block 中关闭套接字,以便发送可能仍在内存缓冲区中的数据。

关于Java 服务器连接重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27393962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com