java - 在与线程的套接字通信中出现 java.net.SocketException 连接重置错误

标签 java sockets java-threads connection-reset

我基本上是在尝试编写多个客户端和服务器之间的套接字通信代码。 我收到此错误java.net.SocketException:连接重置。我已经阅读了一些有关此错误的帖子,但所提出的解决方案似乎都不能解决我的问题。

这是客户端的代码:Client.java



import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;

import javafx.scene.web.PromptData;

public class Client {

    private Socket socket;
    private boolean running;

    public Client(Socket socket) {
        this.socket = socket;
        running = true;
    }

    public void sendToServer(String message) throws IOException {

        DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());

        outputStream.writeUTF(message);
        System.out.println("Die Nachricht : \"" + message + "\" wurde zu dem Server geschickt.");

//      outputStream.close();

    }

    public String waitForNewMessage() throws IOException {

        DataInputStream inputStream = new DataInputStream(socket.getInputStream());

        String message = inputStream.readUTF();
//      inputStream.close();

        return message;
    }

    public void stop() throws IOException {
        socket.close();
        running = false;
    }

    public boolean isRunning() {
        if (running == true) {
            return true;
        }
        return false;
    }

    public String promptForNewMessage() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Geben Sie eine Nachricht ein.");

        String message = scanner.nextLine();
        scanner.close();
        return message;
    }

    public void processReceivedMessage(String message) {

        System.out.println("Hier ist die Antwort des Servers : " + message);

    }


    public static void main(String[] args) throws IOException {

        //Socket clientSocket = new Socket(args[0], Integer.parseInt(args[1]));
        Socket clientSocket = new Socket("localhost",9999);
        Client client = new Client(clientSocket);
        while (true) {

            String message = client.promptForNewMessage();
            client.sendToServer(message);
            String response = client.waitForNewMessage();
            client.processReceivedMessage(response);
            if(response.contains("\\exit")) {
                System.out.println("Die Verbindung wird geschlossen");
                client.stop();
                break;
            }

        }

    }

}

服务器代码:Server.java

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server {

    private int port;
    private boolean running;
    private ServerSocket serverSocket;
    private static Server instance;

    private Server() throws IOException {
        this.port = loadPortFromConfig("config-datei.txt");
        this.running = true;
        this.serverSocket = new ServerSocket(this.port);
    }

    public int loadPortFromConfig(String path) throws FileNotFoundException {
        File config = new File(path);
        Scanner in = new Scanner(config);

        if (in.hasNextLine()) {
            String line = in.nextLine().split(":")[1];
            in.close();
            return Integer.parseInt(line);
        }

        in.close();
        return 9999;
    }

    public static Server getInstance() throws IOException {

        if (instance == null) {
            instance = new Server();
        }
        return instance;
    }

    public static void main(String[] args) throws IOException {

        Server server = Server.getInstance();

        if (args.length != 0) {
            server.port = Integer.parseInt(args[0]);
        }
        System.out.println("Der Port des Servers ist : " + server.port);

        while(true) {
            Socket socket = null;

            try {
                socket = server.serverSocket.accept();

                System.out.println("A new client is connected : " + socket);

                System.out.println("Assigning a new thread for this client");

                Thread t = new Connection(socket);

                t.start();
            }
            catch(IOException e) {
                e.printStackTrace();
            }
        }

    }

    static class Connection extends Thread {

        private Socket clientSocket;
        private boolean running;

        public Connection(Socket clientSocket) {
            this.clientSocket = clientSocket;
            this.running = true;
        }

        @Override
        public void run() {

            String fromClient = "";

            while(true) {

                try {
                    fromClient = waitForMessage();
                    System.out.println("Der Client hat die Nachricht : \"" + fromClient + "\" geschickt");

                    if(fromClient.contains("\\exit")) {
                        System.out.println("Client "+this.clientSocket + "sneds exit...");
                        System.out.println("Closing connection.");
                        sendToClient(fromClient);
                        System.out.println("Connection closed");
                        running = false;
                        break;
                    }
                    sendToClient(fromClient);
                }
                catch(IOException e) {
                    e.printStackTrace();
                }
            }

        }

        public String waitForMessage() throws IOException {
            DataInputStream inputStream = new DataInputStream(clientSocket.getInputStream());
            String message = inputStream.readUTF();
//          inputStream.close();
            return message;
        }

        public void sendToClient(String message) throws IOException {
            DataOutputStream outputStream = new DataOutputStream(clientSocket.getOutputStream());
            outputStream.writeUTF("Die folgende Nachricht : \"" + message + "\" wurde geschickt");
//          outputStream.close();
        }

    }

}

错误发生在服务器代码的 try catch block 中的 fromClient = waitForMessage(); 行 此代码调用以下行中的方法 waitForMessage():String message = inputStream.readUTF();

你有什么建议吗?谢谢

最佳答案

java.net.SocketException: Connection reset

这意味着操作系统已重置连接,因为另一端的进程不再运行。看来您的客户端在处理来自服务器的第一个回复后崩溃了。

Scanner scanner = new Scanner(System.in);
scanner.close();

请勿关闭在 System.in 上运行的扫描仪。这将关闭 System.in,您将无法再从那里读取任何内容。

关于java - 在与线程的套接字通信中出现 java.net.SocketException 连接重置错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61991876/

相关文章:

java - 两个内部嵌套循环运行时间

java - 如何将 Waze 流量​​数据集成到网站中?

c# - 从 Socket 读取连续消息

java - Android FileChannel 在不同的 AsyncTask 中读写失败

java - 如何在 Java 线程运行时中断或终止它

java - JAXB 中多次出现部分返回空列表

java - jcifs.smb.SmbException : The network name cannot be found 异常

c - sendfile() 完成到非阻塞套接字

javascript - jsp : Could I change the order of render/execution

java - Top 命令 - Java 进程内线程的名称