В программе сокета клиентского сервера, получение исключения сокета, когда входной поток не читается clientocket - PullRequest
0 голосов
/ 11 сентября 2018

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

    private static ServerSocket sc = null;

    private static final int port = 3500;

    public static void main(String args[]) throws IOException{
        try {
             sc = new ServerSocket(port);
             while(true){   
                Socket socket = sc.accept();
                System.out.println("Listening on port <=> "+port);
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                String message = (String) ois.readObject();
                System.out.println("Received Request <=>"+message);
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                oos.writeObject("Hi Client received your message<=>"+message);
                ois.close();
                oos.close();
                socket.close();
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

Код сокета клиента, приведенный ниже:

try {

            ObjectOutputStream oos = null;
            ObjectInputStream ois = null;
            Socket clientsocket = null;

            for(int i=0;i<2;i++){
            clientsocket = new Socket(InetAddress.getLocalHost().getHostName(), 3500);
            oos = new ObjectOutputStream(clientsocket.getOutputStream());
            oos.writeObject("Client Request: "+i);
            //ois = new ObjectInputStream(clientsocket.getInputStream());
            //String message = (String) ois.readObject();
            //System.out.println("Message sent by Server: " + message);
            //ois.close();
            oos.close();    
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

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

Получение ниже исключения после комментирования секции входного потока, как сделано выше.

Listening on port <=> 3500
Received Request <=>Client Request: 0
java.net.SocketException: Software caused connection abort: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(Unknown Source)
    at java.net.SocketOutputStream.write(Unknown Source)
    at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source)
    at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(Unknown Source)
    at java.io.ObjectOutputStream.writeNonProxyDesc(Unknown Source)
    at java.io.ObjectOutputStream.writeClassDesc(Unknown Source)
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeFatalException(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at com.springexercise.demo.ServerTest.main(ServerTest.java:28)

1 Ответ

0 голосов
/ 11 сентября 2018

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

Если вы удалите

ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject("Hi Client received your message<=>"+message);
....
oos.close();

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

Если у вас есть часть для чтения клиента в коде, весь процесс работает, потому что клиент ожидает новых данных в соединении. Это приводит к ситуации, когда соединение все еще открыто, когда сервер пытается выполнить запись и все работает, как и ожидалось, с сайта Java.

...