Java 服务器-客户端连接重置

叶夫根尼

我的本地机器上运行着服务器和客户端应用程序。客户端获取文件,更改它并发送到服务器,如果文件正确,则服务器响应。客户端执行多次,一次发送一个文件。我从客户端发送了两个文件,在第二个文件上我得到了连接重置

服务器片段:

private void initServer() throws IOException {
    while (true) {
        ServerSocket server = new ServerSocket(55555);
        Socket fromclient = server.accept();

        InputStream sin = fromclient.getInputStream();
        OutputStream sout = fromclient.getOutputStream();

        DataInputStream in = new DataInputStream(sin);
        DataOutputStream out = new DataOutputStream(sout);

        String line = in.readUTF();

        if (line.equals("new file")) {
            long fileSize = in.readLong();

            tempSavedFile = new File("/home/evgeniy/Files/Downloads/temp");

            tempSavedFile.createNewFile();
            try (FileOutputStream fos = new FileOutputStream(tempSavedFile)) {
                int t;
                for (int i = 0; i < fileSize; i++) {
                    t = sin.read();
                    fos.write(t);
                }
            }

            if (checkPadding(tempSavedFile)) {
                out.writeInt(PADDING_OK_RESPONSE);
            } else {
                out.writeInt(PADDING_ERROR_RESPONSE);
            }
            out.flush();
        }
        out.close();
        in.close();
        sout.close();
        sin.close();
        fromclient.close();
        server.close();
    }
}

在 for 循环中调用新线程的客户端类

for (byte i = 0; i < 2; i++) {
Callable callable = new FileSender(tempFile);
        FutureTask<Integer> ftask = new FutureTask<>(callable);
        Thread thread = new Thread(ftask);            
        thread.start();

        int response = 3244;
        try {
            response = ftask.get();
        } catch (InterruptedException | ExecutionException ex) {
            Logger.getLogger(FXMLController.class.getName()).log(Level.SEVERE, null, ex);
        }
        putMessage(String.valueOf(response));

客户端可调用线程:

public Integer call() throws Exception {
    Socket socket = new Socket(address, serverPort);
    InputStream sin = socket.getInputStream();
    OutputStream sout = socket.getOutputStream();
    DataInputStream in = new DataInputStream(sin);
    DataOutputStream out = new DataOutputStream(sout);

    out.writeUTF("new file");
    out.flush();

    out.writeLong(file.length);
    out.flush();

    sout.write(file);
    sout.flush();

    System.out.println(socket.isConnected());
    int response = in.readInt();
    System.out.println("--------RESP="+response);

    out.close();
    in.close();
    sin.close();
    sout.close();
    socket.close();
    return response;
}

如您所见,我发送了两个文件,并在客户端应用程序上获取此控制台输出:

true
--------RESP=200
true
ноя 20, 2018 5:16:36 PM com.evgeniy_mh.paddingoracle.FXMLController SendFileToServer
SEVERE: null
java.util.concurrent.ExecutionException: java.net.SocketException: Connection reset

另外,我不明白为什么套接字可以,但是

int response = in.readInt();

引发连接重置异常。

普兰加尔

您的代码创建一个新的ServerSocket,然后为它处理的每个请求关闭创建的服务器套接字。代码不使用同一个ServerSocket实例来处理多个请求。


连接重置失败似乎是因为这个原因,因为当第二个请求正在创建与服务器的套接字连接时,现有的ServerSocket已关闭并在同一端口上重新创建,从而导致连接被重置。首先尝试ServerSocket在 while 循环之外取出创建。

private void initServer() {
    try (ServerSocket server = new ServerSocket(5555)) {
        while (true) {
            Socket fromclient = server.accept();

        ... // remaining code

            fromclient.close();
        }
    } catch (IOException ioe) {
        // handle failures
    }
}

try-with-resources处理.close()的呼叫AutoCloseable服务器套接字。


另请注意,请求将在代码中的单个线程上串行处理。通常,SocketServerSocket#accept()(或从它派生的流)的连接获得的信息会传递给单独的线程进行处理,这与串行处理请求的代码不同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

连接客户端服务器Java

Java RMI客户端如何使用域名连接到Java RMI服务器

Java服务器-多客户端TCP连接I / O

c#客户端使用protobuf连接java netty服务器

Java 客户端服务器聊天应用程序失去连接

为什么客户端无法在此java nio程序中连接到服务器?

Java RMI客户端和远程服务器连接被拒绝到本地主机

如何在Java客户端中存储服务器密码以便以后重新连接?

检查Java TCP服务器上的客户端断开连接-仅输出

Android客户端PC服务器java套接字连接失败

Java如何使服务器向连接的每个客户端发送消息

在JAVA中将UDP服务器连接到客户端

Java-将客户端连接到没有本地主机的服务器

从Java游戏服务器到客户端的TCP和UDP连接

无法将Java客户端连接到ElasticSearch服务器

如何在 Java 中为断开连接的客户端杀死服务器中的线程

从RSocket-Java客户端连接到Spring Boot RSocket服务器时出错

如何使用客户端服务器Java程序连接2台计算机

Java服务器-是否可以获取客户端用于连接的主机名?

连接到Java服务器时Android客户端崩溃

Java:Internet可用时,客户端自动连接到服务器

为每个客户端编写具有多个UDP连接的Java服务器

Java在客户端中检测到与服务器的断开连接

一台客户端断开连接后服务器关闭(JAVA)

Java套接字服务器-客户端;卡在服务器端

Java TCP 客户端/服务器套接字

简单的Java客户端/服务器程序

SSH客户端到telnet服务器JAVA

转到服务器和Java客户端通信