Ошибка при отправке сообщения на сервер SocketServer от клиента сокета [JAVA] - PullRequest
0 голосов
/ 05 июня 2018

Код сервера

package chatserver;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import java.net.*;
import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;

public class ChatController implements Initializable {

    private ServerSocket server;
    private Socket userMachine;
    private DataOutputStream os;
    private DataInputStream in;

    @FXML
    private TextField message;

    @FXML
    private ListView messageArea;

    @FXML
    private void sendMessage(ActionEvent event) {
        String mMessage = message.getText().trim();
        if (mMessage.isEmpty()) {
            Alert warn = new Alert(AlertType.WARNING, "Enter a message");
            warn.show();
        } else {
            try {
                this.os.writeUTF(mMessage);
                System.out.println("Message sent");
                this.os.flush();
                message.clear();
                if (!userMachine.isConnected()) {
                    System.out.println("Client disconnected");
                }
            } catch (IOException e) {
                Alert error = new Alert(AlertType.ERROR, "Unable to send message. err: " + e.getMessage());
                error.show();
                e.printStackTrace();
            }
        }
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        try {
            server = new ServerSocket(ChatServer.port);
            Alert waiting = new Alert(AlertType.INFORMATION, "Waiting for user at port: " + ChatServer.port +
            " IP: " + server.getInetAddress().toString());
            waiting.show();

            userMachine = server.accept();
            waiting.hide();
            Alert confirm = new Alert(AlertType.CONFIRMATION, "User Connected");
            confirm.show();

            this.os = new DataOutputStream(userMachine.getOutputStream());
            this.in = new DataInputStream(userMachine.getInputStream());

            // start receive thread
            Thread clientThread = new Receive(this.in);
            clientThread.start();
        } catch (IOException e) {
            Alert alert = new Alert(AlertType.ERROR, "Error: " + e.getMessage() + " at line 77");
            alert.show();
        }
    }    

    public class Receive extends Thread {
        DataInputStream in;
        public String mData;

        public Receive(DataInputStream in) {
            this.in = in;
        }

        @Override
        public void run() {
            try {
                int count = 0;

                while (true) {
                    if (in.available() > 0) {
                        try {
                            setData(in.readUTF());
                            Platform.runLater(new Runnable() {
                                @Override 
                                public void run() {
                                    try{
                                      messageArea.getItems().add(getData());
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                            });
                        } catch (EOFException e) {if (count < 1)         {e.printStackTrace(); count ++;}}
                    }
                }

            } catch (IOException e) {
                e.printStackTrace();
                Platform.runLater(() -> {
                    Alert wentWrong = new Alert(AlertType.ERROR, "SERVER - Error at line 119: Something went wrong while establishing connection: err: " + e.getStackTrace().toString());
                    wentWrong.show();
                });

            }  

        }
        private void setData(String data) {
            this.mData = data;
        }
        private String getData() {
            return this.mData;
        }
    }
}

Код клиента

package chatclient;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import java.net.*;
import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;

public class ChatController implements Initializable {

    private Socket client;
    private DataOutputStream os;
    private DataInputStream in;

    @FXML
    private TextField message;

    @FXML
    private ListView messageArea;

    @FXML
    private void sendMessage(ActionEvent event) {
        String mMessage = message.getText().trim();

        if (mMessage.isEmpty()) {
            Alert warn = new Alert(AlertType.WARNING, "Enter a message");
            warn.show();
        } else {
            try {
                os.writeUTF(mMessage);
                os.flush();
                message.clear();
                message.requestFocus();
                System.out.println("Message sent");
                if (!client.isConnected()) {
                    System.out.println("Server disconnected");
                }
            } catch (IOException e) {
                Alert error = new Alert(AlertType.ERROR, "Unable to send message. err: " + e.getMessage());
                error.show();
            }
        }
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        try {
            // Socket Thread
            Thread socket = new SocketClient();
            socket.start();
        } catch (Exception e) {}
    }    

    public class SocketClient extends Thread {
        private boolean sysOk = true;
        private String message;

        SocketClient () {
            try {
                client = new Socket(ChatClient.ip, ChatClient.port);
                in = new DataInputStream(client.getInputStream());
                os = new DataOutputStream(client.getOutputStream());

                Alert confirm = new Alert(AlertType.CONFIRMATION, 
                    "Connected to " + client.getInetAddress() +
                            " at " + ChatClient.port);
                confirm.show();

            } catch(IOException e) {
                sysOk = false;
                Alert wentWrong = new Alert(AlertType.ERROR, 
                    "Something went wrong while establishing connection");
                wentWrong.show();
                e.printStackTrace();
            }
        }

        @Override
        public void run() {
            if (sysOk) {
                while (true) {
                    try {
                        if (in.available() > 0) {
                            try {
                                setMessage(in.readUTF());
                                Platform.runLater(new Runnable () {
                                    @Override
                                    public void run () {                                                messageArea.getItems().add(getMessage());
                                    }
                                });
                            } catch (Exception e) {
                                Alert messageRetrieveError = new Alert(
                                AlertType.ERROR, "Message Retrieval Failled");
                                messageRetrieveError.show();
                                e.printStackTrace();
                            }
                        }
                    } catch (IOException e) {}
                }
            } 
        }

        private void setMessage(String data) {
            this.message = data;
        } 

        private String getMessage() {
            return this.message;
        }
    }
}

Итак, дело в том, что когда я создаю сервер на каком-то порту, скажем 6000, и пытаюсь подключить его с помощью клиентского программного обеспечения.Не работаетЯ пытаюсь отправить некоторые сообщения от серверного программного обеспечения, во второй раз я получаю: Программное обеспечение вызвало прерывание соединения: ошибка записи в сокет

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

ОШИБКИ: НА СТОРОНЕ СЕРВЕРА:

java.net.SocketException: программное обеспечение вызвало прерывание соединения: ошибка записи сокета в java.net.SocketOutputStream.socketWrite0 (собственный метод) в java.net.SocketOutputStream.socketWrite (SocketOutputStream.java:109) в java.net.SocketOutputStream.write (SocketOutputStream.java:153) в java.io..DataOutputStream.write (DataOutputStream.java:107) в java.io.DataOutputStream.writeUTF (DataOutputStream.java:401) в java.io.DataOutputStream.writeUTF (DataOutputStream.java:323) в chatserver.Controller (ChatController).Java: 39) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498.inmin.trake(MethodUtil.java:71) в sun.reflect.GeneratedMethodAccessor1.invoke (неизвестный источник) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Methojin) at sun.reflect.misc.MethodUtil.invoke (MethodUtil.java:275) в javafx.fxml.FXMLLoader $ MethodHandler.invoke (FXMLLoader.java:1769) в javafx.fxml.FXMLLoader $ ControllerMethodEventjando: (FXXLLo::1657 г..dispatchBubblingEvent (EventHandlerManager.java:191) в com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent (CompositeEventDispatcher.java:59) по адресу com.sun.javafx.event.BasicEventDispatcher.dispatchEvent (BasicEventDispatcher.java:58) по адресу com.sun.javafx.event.EventDispatchChainImpl.junisIp_IventEp_Ivent_ImpIp:.javafx.: 56) в com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent (EventDispatchChainImpl.java:114) в com.sun.javafx.event.EventUtil.fireEventImpl (EventUtil.java:74) в com.sun.javaf.EventUtil.fireEvent (EventUtil.java:49) в javafx.event.Event.fireEvent (Event.java:198) в javafx.scene.Node.fireEvent (Node.java:8413) в javafx.scene.control.Button.fire(Button.java:185) в com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased (ButtonBehavior.java:182) в com.sun.javafx.scene.control.skin.BehaviorSkinBase $ 1.handle (BehaviorSkinBase.java:96) в com.sun.javafx.scene.control.skin.BehaviorSkinBase $ 1.handle (BehaviorSkinBase.java:89) в com.sun.javafx.event.Homposite $NormalEventHandlerRecord.handleBubblingEvent (CompositeEventHandler.java:218) в com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent (CompositeEventHandler.java:80) в com.sun.javafx.anda.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent (EventHandlerManager.java:191)в com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent (CompositeEventDispatcher.java:59) в com.sun.javafx.event.BasicEventDispatcher.dispatchEvent (BasicEventDispatcher.java:58) копи-хранилище(EventDispatchChainImpl.java:114) по адресу com.sun.javafx.event.BasicEventDispatcher.dispatchEvent (BasicEventDispatcher.java:56) по адресу com.sun.javafx.event.EventDispatchChainImpl.dispatchEj.javafx.event.BasicEventDispatcher.dispatchEvent (BasicEventDispatcher.java:56) в com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent (EventDispatchChainImpl.java:114) в com.sun.java.j.f.74) в com.sun.javafx.event.EventUtil.fireEvent (EventUtil.java:54) в javafx.event.Event.fireEvent (Event.java:198) в javafx.scene.Scene $ MouseHandler.process (Scene.java): 3757) в javafx.scene.Scene $ MouseHandler.access $ 1500 (Scene.java:3485) в javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) в javafx.scene.Scene $ ScenePeerListener.mouseEvent (Scene.java:2494) в com.sun.javafx.tk.quantum.GlassViewEventHandler $ MouseEventNotification.run (GlassViewEventHandler.java:3: 3).sun.javafx.tk.quantum.GlassViewEventHandler $ MouseEventNotification.run (GlassViewEventHandler.java:294) в java.security.AccessController.doPrivileged (собственный метод) в com.sun.javafx.tk.quantum.GlassViewEvent $GlassViewEventHandler.java:416) на com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock (QuantumToolkit.java:389) на com.sun.javafx.tk.quantum.GlassViewEventHandler.handlerEventEvent: Ивент.sun.glass.ui.View.handleMouseEvent (View.java:555) на com.sun.glass.ui.View.notifyMouse (View.java:937) на com.sun.glass.ui.win.WinApplication._runLoop(Собственный метод) по адресу com.sun.glass.ui.win.WinApplication.lambda $ null $ 148 (WinApplication.java:191) по адресу java.lang.Thread.run (Thread.java:745)

прия отправляю сообщение дляво второй раз .. Нет ошибки на стороне клиента.

Пожалуйста, помогите мне с этим.
И извините за такой плохой текст

...