Java 检查是否有传入的套接字

Java 检查是否有传入的套接字,java,sockets,connection,Java,Sockets,Connection,我正在为我的游戏创建一个服务器,但这个问题与java更相关。所以我想检查他们的是一个输入插座,但我仍然想运行游戏,因为服务器由用户托管,而不是由外部程序分离。但我仍然想检查是否有人正在使用套接字连接。我现在拥有的是: public void updateConnection() throws IOException { Socket connection = server.accept(); System.out.println("Ape is connecting

我正在为我的游戏创建一个服务器,但这个问题与java更相关。所以我想检查他们的是一个输入插座,但我仍然想运行游戏,因为服务器由用户托管,而不是由外部程序分离。但我仍然想检查是否有人正在使用套接字连接。我现在拥有的是:

    public void updateConnection() throws IOException {


    Socket connection = server.accept();

    System.out.println("Ape is connecting");

    ServerClient client = new ServerClient(connection);

    clientsWaiting.add(client);

}

我希望每一帧都使用这种方法,而不是不断地检查是否可行。如果不可能,我还应该使用什么来创建我的服务器,并检查是否有一些服务器连接到每个帧。

最好让游戏在单独的线程中检查传入的套接字连接。您可以创建一个
Runnable
,它只持续侦听连接

检查传入连接时:
Socket connection=server.accept(),实际发生的情况是在该特定线程上放置块,直到收到连接为止。这将导致代码停止执行。解决这个问题的唯一方法是并行化。您可以在一个线程上处理所有网络任务,同时在另一个线程上处理游戏逻辑和渲染

不过要注意,编写要在多个线程上运行的代码有很多缺点。Java提供了一些工具来最小化潜在的问题,但是要确保代码是线程安全的,这取决于程序员。详细讨论关于并行编程的许多问题超出了这个问题的范围。我建议您对它做一些研究,因为这种类型的编程产生的bug有时很难复制和跟踪

既然我已经给了您这个免责声明,要使用
Runnable
来完成您试图做的事情,您可以做类似的事情:

Runnable networkListener = () -> {
    //declare and instantiate server here
    while(true){
         Socket connection = server.accept();
         //whatever you would like to do with the connection would go here
    }
}
Thread networkThread = new Thread(networkListener);
networkThread.start();
你会把它放在你的游戏循环之前,它会产生一个线程来监听连接,而不会中断你的游戏。关于如何使用
ThreadPool
s跟踪
Socket
s,有很多很好的习惯用法,每次建立新连接时都会产生一个新的
Thread
,因此我建议您也做一些研究


祝你好运,这不是一条你要冒险走的路。

你最好在一个单独的线程中检查传入的套接字连接。您可以创建一个
Runnable
,它只持续侦听连接

检查传入连接时:
Socket connection=server.accept(),实际发生的情况是在该特定线程上放置块,直到收到连接为止。这将导致代码停止执行。解决这个问题的唯一方法是并行化。您可以在一个线程上处理所有网络任务,同时在另一个线程上处理游戏逻辑和渲染

不过要注意,编写要在多个线程上运行的代码有很多缺点。Java提供了一些工具来最小化潜在的问题,但是要确保代码是线程安全的,这取决于程序员。详细讨论关于并行编程的许多问题超出了这个问题的范围。我建议您对它做一些研究,因为这种类型的编程产生的bug有时很难复制和跟踪

既然我已经给了您这个免责声明,要使用
Runnable
来完成您试图做的事情,您可以做类似的事情:

Runnable networkListener = () -> {
    //declare and instantiate server here
    while(true){
         Socket connection = server.accept();
         //whatever you would like to do with the connection would go here
    }
}
Thread networkThread = new Thread(networkListener);
networkThread.start();
你会把它放在你的游戏循环之前,它会产生一个线程来监听连接,而不会中断你的游戏。关于如何使用
ThreadPool
s跟踪
Socket
s,有很多很好的习惯用法,每次建立新连接时都会产生一个新的
Thread
,因此我建议您也做一些研究


祝你好运,这不是一条你要冒险走的路。

还有一条补充:当你建立TCP连接时,你不是在处理帧(UDP是基于帧的协议),而是在处理字节流。 下杠杆字节输出数据组示例:

InputStream inputStream = socket.getInputStream();  

// read from the stream  
ByteArrayOutputStream baos = new ByteArrayOutputStream();  
byte[] content = new byte[ 2048 ];  
int bytesRead = -1;  
while( ( bytesRead = inputStream.read( content ) ) != -1 ) {  
    baos.write( content, 0, bytesRead );  
} // while 

所以,当客户端完成写入,但流仍然打开时,您的读取方法将被阻塞。如果您希望从客户端获得某些数据,请先读取数据,然后调用打印方法或以您希望的方式通知,等等。

还有一个补充:当您建立TCP连接时,您不是在处理帧(UDP是基于帧的协议),而是在处理字节流。 下杠杆字节输出数据组示例:

InputStream inputStream = socket.getInputStream();  

// read from the stream  
ByteArrayOutputStream baos = new ByteArrayOutputStream();  
byte[] content = new byte[ 2048 ];  
int bytesRead = -1;  
while( ( bytesRead = inputStream.read( content ) ) != -1 ) {  
    baos.write( content, 0, bytesRead );  
} // while 

所以,当客户端完成写入,但流仍然打开时,您的读取方法将被阻塞。如果您希望从客户端获得某些数据,您可以读取这些数据,然后调用您的打印方法或以任何方式通知,等等。

您的意思是什么?这个可运行的我可以随时启动??是的,但您应该在程序中只启动一次。它将在程序的整个执行过程中继续运行。你是什么意思?这个runnable我可以随时启动?是的,但你应该在程序中只启动一次。它将在程序的整个执行过程中继续运行。