Код сервера
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)
прия отправляю сообщение дляво второй раз .. Нет ошибки на стороне клиента.
Пожалуйста, помогите мне с этим.
И извините за такой плохой текст