带有javaFX的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

我正在努力了解我的项目的TCP。我必须用网络制作一个游戏,在这个游戏中,客户端可以观看主要玩家。为此,我通过tcp发送状态数据。 但是在初始化一个
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()。