Java简单I / O服务器&客户端连接重置?

时间:2013-11-29 12:23:13

标签: java sockets networking

三天前我开始学习网络,套接字,在开始使用eclipse IDE后,我开始了解一些事情。

我设法使客户端工作,基本上将输入发送到服务器,但是当我这样做时,我收到以下错误:

java.net.SocketException: Connection reset

这是服务器的完整日志:

Server started.
Connected: /127.0.0.1:57276
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    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 Server.run(Server.java:31)
    at Server.main(Server.java:22)

第31行:

in = input.readLine();

第22行:

run();

我可能没有正确阅读I / O,我并没有真正看到“很多”的例子,我试图自己去做,并从错误中吸取教训。

有人能解释一下这里发生了什么吗?为什么重置连接?

服务器:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;

public class Server {

    private static ServerSocket socket;
    private static PrintWriter output;
    private static BufferedReader input;
    private static Socket socketClient;

    public static void main(String[] args) {
        try {
            System.out.println("Server started.");
            socket = new ServerSocket(43537);
            socketClient = socket.accept();
            output = new PrintWriter(socketClient.getOutputStream());
            input = new BufferedReader(new InputStreamReader(socketClient.getInputStream()));
            System.out.println("Connected: " + socketClient.getRemoteSocketAddress().toString());
            run();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void run() throws IOException {
        String in;
        while (socketClient.isConnected()) {
             in = input.readLine();
            if (in != null) {
                System.out.println(in);
            }
        }
    }
}

客户端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;
import java.util.Scanner;

public class build {

    /**
     * @param args
     * @throws IOException 
     * @throws UnknownHostException 
     */
    public static void main(String[] args) {
        try {
            System.out.println("Client started");
            Socket sock = new Socket("localhost", 43537);
            Scanner scanner = new Scanner(System.in);
            String input;
            PrintWriter out = new PrintWriter(sock.getOutputStream());
            BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream()));

            input = scanner.nextLine();

            if (input != null) {
                out.print(input);
            }
            if (reader.toString() != null) {
                System.out.println(reader.toString());
            }
        } catch (IOException e) {
            System.out.println("Client error");
        }

    }

}

3 个答案:

答案 0 :(得分:0)

您的客户端已将数据从kbd写入socket并在服务器尝试读取第31行的消息时关闭套接字。似乎是因为您在客户端而不是reader.toString()错误地执行了reader.readLine()readLine()将使客户端保持在线状态,直到收到服务器响应(或服务器关闭)。

在客户端,您需要更改为

        if (input != null) {
            out.println(input);
            out.flush();
        }
  • println(),而不是print(),因为您在服务器端使用readLine(),在看到\n之前不会返回;
  • 即便如此,您需要out.flush()将数据发送到网络;

答案 1 :(得分:0)

你需要刷新你的溪流,关闭()你的溪流并关闭()你的插座。如果没有教你这么做,你一直在读一本糟糕的教程。

  

我可能没有正确读取I / O,我没有真正看过   “很多”例子,我试图自己弄清楚并从错误中吸取教训。

也许你应该重新考虑你的学习策略。

答案 2 :(得分:0)

我看到的第一件事是您的客户端只读取一行输入,将其发送到服务器,然后程序终止,从而关闭套接字 - 这就是错误消息所说的。