Почему SocketException? - PullRequest
       15

Почему SocketException?

0 голосов
/ 19 декабря 2009

У меня есть класс Client и класс Server, но когда я запускаю оба основных метода, и тогда ничего не происходит, и когда я прекращаю работу, возникает это исключение. Зачем?? пожалуйста, помогите мне, как я могу это исправить ???

Мой клиентский класс:

public class Client {

static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

    try {
        Socket c = new Socket("localhost", 5001);
        BufferedReader read = new BufferedReader(new InputStreamReader(c.getInputStream()));
        BufferedWriter write = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
        String string = reader.readLine();
        write.write(string, 0, string.length());
        write.newLine();
        write.flush();
        System.out.println(read.readLine());



    } catch (Exception e) {
        System.err.println(e);
    }
}}

Класс моего сервера:

public class Server{

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

    ServerSocket s = null;
    try {
        s = new ServerSocket(5001);
        System.out.println("listening...");
        Socket so = s.accept();
        BufferedReader read = new BufferedReader(new InputStreamReader(so.getInputStream()));
        BufferedWriter write = new BufferedWriter(new OutputStreamWriter(so.getOutputStream()));
        while (true) {
            String string = read.readLine();
            System.out.println(string);
            String answer = "I got" + string + "from you!";
            write.write(answer, 0, answer.length());
            write.newLine();
            write.flush();
        }
    } catch (IOException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }

}}

трассировка стека в серверной cpnsole:

run:


listening...
system connected
Hello

Dec 19, 2009 12:58:15 PM server.Main main
SEVERE: null
java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:168)
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
        at java.io.InputStreamReader.read(InputStreamReader.java:167)
        at java.io.BufferedReader.fill(BufferedReader.java:136)
        at java.io.BufferedReader.readLine(BufferedReader.java:299)
        at java.io.BufferedReader.readLine(BufferedReader.java:362)
        at server.Main.main(Main.java:37)
BUILD SUCCESSFUL (total time: 9 seconds)

в клиентской консоли:

run:
Hello
I gotHellofrom you!
BUILD SUCCESSFUL (total time: 4 seconds)

Ответы [ 2 ]

3 голосов
/ 19 декабря 2009

Ваш клиент подключается к серверу, отправляет некоторые данные, читает ответ и завершает работу. Это нормально.

Но ваш сервер ждет клиента, читает его данные, пишет ответ и затем пытается снова прочитать некоторые данные с клиента . Но клиент закрыл соединение. Таким образом, сервер получает исключение, которое вы описали.

Чтобы исправить это (на стороне сервера), вы должны выполнить Socket so = s.accept(); в цикле while. И не забудьте закрыть сокет в конце цикла.

0 голосов
/ 19 декабря 2009

Во-первых. A BufferedWriter бесполезен с Sockets. Используйте PrintWriter ведьму автоматически.

PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);// true means "flush automatically"
writer.println(reader.readLine());
// Now you don't have to add a newline and flush.

Редактировать

Во-вторых. Причина, по которой генерируется исключение, заключается в том, что клиент закрывает сокет после записи вашего ввода на сервер. Сервер все еще ожидает чтения другой строки. Но он не может, потому что сокет закрыт. Вы не закрываете это буквально. Но на этом программа заканчивается. Поэтому Java думает: «Ничего не осталось, выход». При выходе соединение закрывается.

Чтобы решить эту проблему, вы должны поместить соединение в цикл while(true) и, чтобы правильно разорвать соединение, отправить сообщение об окончании соединения.

Клиентская сторона:

while (true)
{
    String userinput = reader.readLine(); // From System.in
    writer.writeln(userinput);
    if (userinput.equals("end"))
    {
        socket.close();
        break; // break out of the while(true) loop
    }
}

Серверная часть:

while (true) {
    String socketinput = reader.readLine();
    if (socketinput.equals("end"))
    {
        socket.close();
        break; // Break out of the while(true) loop.
    }
    ... // Handle the socketInput
}

Это также означает, что "Connection reset".

Мартейн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...