@g33km

Как правильно передавать объекты от клиента к серверу по Socket(SocketException: connection reset)?

Всем доброго времени суток! Практикую передачу данных по сокетам от клиента к серверу и наоборот, в случае передачи текста через PrintWriter все работает хорошо, но как только пытаюсь передавать объекты через ObjectOutputStream, сервер выбрасывает исключение SocketException: connection reset.
Суть: клиент подсоединяется к серверу и отправляет ему сообщение - объект, содержащий в себе имя отправителя и его ID. Сервер этот объект принимает и выводит в консоль имя и ID отправителя.

Сервер
package objectschange;

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

public class ServerSide {

  protected ObjectInputStream serverOIS;
  public static void main(String[] args) {
    ServerSide server = new ServerSide();
    server.launchServer();
  }

  private void launchServer() {
    try {
      ServerSocket srvSocket = new ServerSocket(3200);

      while (true) {
        Socket serverClientSocket = srvSocket.accept();

        serverOIS = new ObjectInputStream(serverClientSocket.getInputStream());
        handleObject(serverOIS);
      }
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  private void handleObject(ObjectInputStream serverOIStream) {
    ClientMessagePackage messagePackage;
    try {
      while ((messagePackage = (ClientMessagePackage) serverOIStream.readObject()) != null) {
        System.out.println(messagePackage.packageSender + " " + messagePackage.packageSenderID);
      }
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}


Клиент

package objectschange;

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

public class ClientSide  {

  protected ObjectOutputStream clientOOS;

  public static void main(String[] args) {
    ClientSide client = new ClientSide();
    client.establishConnection();
  }

  private void establishConnection() {
    try {
      Socket clientSocket = new Socket("127.0.0.1", 3200);
      Thread.sleep(3000);
      clientOOS = new ObjectOutputStream(clientSocket.getOutputStream());

      sendPackage(clientOOS, new ClientMessagePackage("Name", 1));
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  private void sendPackage(ObjectOutputStream clientOOStream, ClientMessagePackage clientMPackage) {
    try {
      clientOOStream.writeObject(clientMPackage);
      clientOOStream.flush();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

}

class ClientMessagePackage implements Serializable {

  protected String packageSender;
  protected int packageSenderID;

  protected ClientMessagePackage(String name, int id) {
    packageSender = name;
    packageSenderID = id;
  }
}


Запускаю вначале сервер, ожидающий запроса, затем клиента, к нему подключающегося. Консоль:
Console
5fd9f9ee593e6566414652.png

При этом если после первого клиента подключить еще одного, то в итоге объект с сообщением до сервера доходит, он его печатает в консоль, но затем снова выбрасывается исключение:
Console
5fd9fa50eb19b789562616.png

Если я правильно понимаю, клиент самостоятельно отключается от сервера(?), почему это происходит?
Не могу понять, в чем проблема, прошу вашего совета.
Заранее благодарю за ответы!
  • Вопрос задан
  • 138 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы