Проблема с клиентским сервером Java - PullRequest
0 голосов
/ 09 мая 2018

Что я пытаюсь сделать

Клиент-серверное приложение: клиент открывает графический интерфейс с кнопкой «Читать».При нажатии на нее откроется новый фрейм с некоторыми статьями для чтения.На этом этапе короткий String.

Аннотация:

  • После того, как вы запустите сервер и клиент, клиент увидит кадр с кнопкой.
  • В ответ я хочу, чтобы сервер отправлял мне определенные / разные вещи в зависимости от того, на какую операцию я нажимаю.

То, что я пытался

На данном этапе разработки я застрял с сообщением об ошибке:

Exception in thread "main" java.net.SocketException: Software caused connection abort: socket write error

Это серверный класс:

public class StartServer {


    public static void main(String[] argv) throws Exception {

        @
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("Server started");


        while (true) {

            List<String> receive = new ArrayList<String>();

            // Wait for client to connect
            Socket aNewClientSocket = serverSocket.accept();

            System.out.println("Server-Client connexion established!!");

            ObjectInputStream toReceiveFromClient = new ObjectInputStream(aNewClientSocket.getInputStream());
            receive = (List<String>) toReceiveFromClient.readObject();

            System.out.println(aNewClientSocket.getLocalPort());
            System.out.println(aNewClientSocket.getInetAddress());

            switch (receive.get(0)) {
            case "Reader button click":
                List<Object> toSend = new ArrayList<Object>();
                Article a=new Article();
                a.setTitle("New Title");
                toSend.add(a);
                ObjectOutputStream objectWayToSend = new ObjectOutputStream(aNewClientSocket.getOutputStream());
                objectWayToSend.writeObject(toSend);
                objectWayToSend.flush();


            default:
                throw new IllegalArgumentException("Bad request from client!!");
            }

Соответствующий метод клиентов:

    public void sendToServer(List<String> toSend) throws UnknownHostException, IOException {
        try {


        Socket socket = new Socket("localhost", 9999);
        ObjectOutputStream objectWayToSend = new ObjectOutputStream(socket.getOutputStream());

        objectWayToSend.writeObject(toSend);
        objectWayToSend.flush();

        objectWayToSend.close();

        }
        catch(Exception e) {
            JOptionPane.showMessageDialog(frame, "The server is offline or connection can't be establish!");
        }
    }

    @SuppressWarnings("unchecked")
    public List<Object> receiveFromServer() throws UnknownHostException, IOException {
        List<Object> receive = new ArrayList<Object>();
        try {

            Socket socket = new Socket("localhost", 9999);
        ObjectInputStream objectToGet = new ObjectInputStream(socket.getInputStream());

        receive=(List<Object>) objectToGet.readObject();



        }
        catch(Exception e) {
            JOptionPane.showMessageDialog(frame, "The server is offline or connection can't be establish!");
        }
        return receive;

Ссылочная кнопка в графическом интерфейсе

    btnCiteste = new JButton("Read");
            btnCiteste.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                    List<String> toSend = new ArrayList<String>();
                    toSend.add("Read");
                    try {
                        sendToServer(toSend);
                        List<Object> received= receiveFromServer();
                        //new ArticoleReaderFrame ();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });

1 Ответ

0 голосов
/ 09 мая 2018

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

Ссылка Официальные причины для «программного обеспечения вызвало прерывание соединения: ошибка записи в сокет»

...