Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Sockets,Java.net.SocketException:连接重置,因为BufferedWriter/Reader?_Java_Sockets_Bufferedwriter - Fatal编程技术网

Java Sockets,Java.net.SocketException:连接重置,因为BufferedWriter/Reader?

Java Sockets,Java.net.SocketException:连接重置,因为BufferedWriter/Reader?,java,sockets,bufferedwriter,Java,Sockets,Bufferedwriter,这只是一个非常简单的服务器/客户机应用程序,我用Java编写,目的是只使用BufferedReader和BufferedWriter。 我启动服务器时没有收到任何错误 但当客户端尝试向服务器发送消息时: java.net.SocketException:连接重置 出现了。我不知道为什么会发生这种情况,但我认为这可能与BufferedWriter有关。 我在网上搜索过,但没有找到任何有用的东西 Server.java import java.io.*; import java.net.*; pu

这只是一个非常简单的服务器/客户机应用程序,我用Java编写,目的是只使用BufferedReader和BufferedWriter。 我启动服务器时没有收到任何错误

但当客户端尝试向服务器发送消息时:

java.net.SocketException:连接重置

出现了。我不知道为什么会发生这种情况,但我认为这可能与BufferedWriter有关。 我在网上搜索过,但没有找到任何有用的东西

Server.java

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

public class Server {
    public Server(int port) {
        try {
            ServerSocket seso = new ServerSocket(port);
            System.out.println("Server started");
            System.out.println("Server listening on port " + port);

            Socket client1 = seso.accept();

            BufferedReader reader = new BufferedReader(new InputStreamReader(client1.getInputStream(), "UTF-8"));
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client1.getOutputStream(), "UTF-8"));

            String s = null;

            while((s = reader.readLine()) != null) {
                System.out.println("Client: " + s);
            }

            writer.close();
            reader.close();
        } catch (Exception e) {e.printStackTrace();}
    }
    public static void main(String args[]) {
        new Server(4444);
    }
}
import java.io.*;
import java.net.*;

public class Client {
    public Client(String serverip) {
        try {
            Socket client = new Socket(serverip, 4444);
            System.out.println("Client connected with: " + serverip);

            BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream(), "UTF-8"));
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream(), "UTF-8"));

            writer.write("Hello Server");
            writer.flush();

        }catch(Exception e){e.printStackTrace();}
    }
    public static void main(String args[]) {
        new Client("localhost");
    }
}
Client.java

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

public class Server {
    public Server(int port) {
        try {
            ServerSocket seso = new ServerSocket(port);
            System.out.println("Server started");
            System.out.println("Server listening on port " + port);

            Socket client1 = seso.accept();

            BufferedReader reader = new BufferedReader(new InputStreamReader(client1.getInputStream(), "UTF-8"));
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client1.getOutputStream(), "UTF-8"));

            String s = null;

            while((s = reader.readLine()) != null) {
                System.out.println("Client: " + s);
            }

            writer.close();
            reader.close();
        } catch (Exception e) {e.printStackTrace();}
    }
    public static void main(String args[]) {
        new Server(4444);
    }
}
import java.io.*;
import java.net.*;

public class Client {
    public Client(String serverip) {
        try {
            Socket client = new Socket(serverip, 4444);
            System.out.println("Client connected with: " + serverip);

            BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream(), "UTF-8"));
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream(), "UTF-8"));

            writer.write("Hello Server");
            writer.flush();

        }catch(Exception e){e.printStackTrace();}
    }
    public static void main(String args[]) {
        new Client("localhost");
    }
}
当我运行服务器和客户机时,我从控制台得到:

Server started
Server listening on port 4444

java.net.SocketException: Connection reset

at java.net.SocketInputStream.read(SocketInputStream.java:209)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
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 Server.<init>(Server.java:24)
at Server.main(Server.java:33)
BUILD SUCCESSFUL (total time: 9 seconds)
之后

Client.java中,我仍然得到:

Server started
Server listening on port 4444
Client: Hello Server

java.net.SocketException: Connection reset

at java.net.SocketInputStream.read(SocketInputStream.java:209)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
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 Server.<init>(Server.java:24)
at Server.main(Server.java:33)
BUILD SUCCESSFUL (total time: 2 seconds)
服务器已启动
在端口4444上侦听的服务器
客户端:你好,服务器
java.net.SocketException:连接重置
位于java.net.SocketInputStream.read(SocketInputStream.java:209)
位于java.net.SocketInputStream.read(SocketInputStream.java:141)
位于sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
位于sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
位于sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
位于java.io.InputStreamReader.read(InputStreamReader.java:184)
在java.io.BufferedReader.fill中(BufferedReader.java:161)
在java.io.BufferedReader.readLine(BufferedReader.java:324)
位于java.io.BufferedReader.readLine(BufferedReader.java:389)
在服务器上。(Server.java:24)
位于Server.main(Server.java:33)
生成成功(总时间:2秒)

您没有完全关闭客户端中的套接字或流。是的,并且您没有发送“\n”,因此服务器的读取挂起。确切地说,您没有关闭套接字,并且在Windows上运行了客户端(但没有这样说)。Windows进程(Java或其他)在未关闭其打开的TCP套接字的情况下终止会导致“异常终止”或连接重置,对于Java对等进程,这会导致出现异常,但在Unix上执行同样的操作不会。非常感谢您的回答。您知道如何正确关闭套接字/流吗?好的,多亏了大家,我已经解决了这个问题:)。