带有javaFX的Tcp导致错误
我正在努力了解我的项目的TCP。我必须用网络制作一个游戏,在这个游戏中,客户端可以观看主要玩家。为此,我通过tcp发送状态数据。 但是在初始化一个带有javaFX的Tcp导致错误,tcp,javafx,Tcp,Javafx,我正在努力了解我的项目的TCP。我必须用网络制作一个游戏,在这个游戏中,客户端可以观看主要玩家。为此,我通过tcp发送状态数据。 但是在初始化一个ChatClient并调用ChatClient中的方法set()之后,我得到了错误 我想不出怎么解决它 package control; import javafx.application.Platform; import java.io.IOException; import java.io.InputStream; import java.io
ChatClient
并调用ChatClient
中的方法set()
之后,我得到了错误
我想不出怎么解决它
package control;
import javafx.application.Platform;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
public class ChatClient extends Thread {
// TextField nachricht;
ObjectInputStream ii;
ChatScreen chat;
GameScreen gamescreen;
Socket socket;
String name;
ObjectOutputStream i;
public ChatClient (String name, ChatScreen chat, GameScreen gamescreen) {
this.chat = chat;
this.gamescreen = gamescreen;
this.name = name;
}
@Override
public void run() {
// Diese Methode wird ausgeführt, wenn ein Client-Thread startet
// Baue eine Verbindung zum entfernten Rechner auf
try (Socket socket = new Socket("localhost", 9004)) {
System.out.println(name);
// this.chat.getButton().setText("w");
// Öffne einen InputStream
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
i = new ObjectOutputStream(out);
ii = new ObjectInputStream(in);
String line;
try {
line = (String) ii.readObject();
System.out.print("text");
if (line != null) {
Platform.runLater(() -> {
gamescreen.getText().appendText(line + "\n");
});
}
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
public GameScreen getGameScreen() {
return gamescreen;
}
public void set() {
Platform.runLater(() -> {
try {
i.writeObject(name + ":" + chat.nachricht.getText() + "\n");
i.close();
} catch (IOException e) {
System.out.print("ws");
e.printStackTrace();
}
});
}
}
服务器:
package control;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
/**
* Server for class {@link de.kaiguenster.javaintro.client.Client}, that handles all connections in their own Threads
*
* @author Kai Günster
*/
public class MultithreadedServer {
static ArrayList<ObjectOutputStream> client = new ArrayList<>();
private static int port = 9004;
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(port);
// this loop runs until the program is shut down (e.g. using `CTRL+C`)
while (true) {
// wait for connection
Socket sock = server.accept();
// When a connection is accepted, handle it in a new Thread
new Thread(new AntwortProzess(sock)).start();
}
}
/**
* Create a server Server
*
* @param port
* Listen-Port
*/
private MultithreadedServer (int port) {
this.port = port;
}
private static void sendMessage(String nachricht) {
}
/**
* Wait for connection and process it.
*
* @throws IOException
*/
/**
* Runnable, to process incomming connections
*/
private static class AntwortProzess extends Thread {
private final Socket socket;
public AntwortProzess (Socket socket) {
this.socket = socket;
}
@Override
public void run() {
// Diese Methode wird vom Thread gerufen, wenn er startet.
try (Socket socket = this.socket) {
System.out.print("true");
/*
Wait 2 seconds first. This waiting priod happend in it's own
Thread and doesn't prevent other connections to be accepted.
*/
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
ObjectOutputStream i = new ObjectOutputStream(out);
ObjectInputStream ii = new ObjectInputStream(in);
client.add(i);
while (true) {
String line = (String) ii.readObject();
if (line != null) {
for (int b = 0; b < client.size(); b++) {
try {
client.get(b).writeObject(line + "\n");
// System.out.print(line);
client.get(b).flush();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
// Write one line of text back to the client.
} catch (IOException | ClassNotFoundException ex) {
System.out.println(ex);
}
}
}
}
包装控制;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.ObjectInputStream;
导入java.io.ObjectOutputStream;
导入java.io.OutputStream;
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.util.ArrayList;
/**
*类{@link de.kaiguenster.javaintro.client.client}的服务器,该类在自己的线程中处理所有连接
*
*@作者Kai Günster
*/
公共类多线程服务器{
静态ArrayList客户端=新建ArrayList();
专用静态int端口=9004;
公共静态void main(字符串[]args)引发IOException{
ServerSocket服务器=新的ServerSocket(端口);
//此循环一直运行到程序关闭为止(例如,使用“CTRL+C”)
while(true){
//等待连接
Socket sock=server.accept();
//当一个连接被接受时,在一个新线程中处理它
新线程(新AntwortProzess(sock)).start();
}
}
/**
*创建服务器
*
*@param端口
*监听端口
*/
专用多线程服务器(int端口){
this.port=端口;
}
私有静态void sendMessage(字符串nachricht){
}
/**
*等待连接并处理它。
*
*@抛出异常
*/
/**
*Runnable,用于处理输入连接
*/
私有静态类AntwortProzess扩展线程{
专用终端插座;
公用防虫草器(插座){
this.socket=socket;
}
@凌驾
公开募捐{
//使用螺纹gerufen的方法,然后开始。
try(Socket=this.Socket){
系统输出打印(“真”);
/*
先等2秒钟,这是它自己的事
线程,不阻止接受其他连接。
*/
InputStream in=socket.getInputStream();
OutputStream out=socket.getOutputStream();
ObjectOutputStream i=新的ObjectOutputStream(输出);
ObjectInputStream ii=新的ObjectInputStream(in);
客户。添加(i);
while(true){
String line=(String)ii.readObject();
如果(行!=null){
对于(intb=0;b
错误:
java.net.SocketException:套接字已关闭
位于java.net.SocketInputStream.socketRead0(本机方法)
位于java.net.SocketInputStream.read(未知源)
位于java.net.SocketInputStream.read(未知源)
位于java.net.SocketInputStream.read(未知源)
位于java.io.ObjectInputStream$PeekInputStream.peek(未知源)
位于java.io.ObjectInputStream$BlockDataInputStream.peek(未知源)
位于java.io.ObjectInputStream$BlockDataInputStream.peekByte(未知源)
位于java.io.ObjectInputStream.readObject0(未知源)
位于java.io.ObjectInputStream.readObject(未知源)
运行(ChatClient.java:59)
请下次格式化您的代码。删除set()方法中的i.close()。