检查是否有传入插座

时间:2017-01-06 15:13:13

标签: java sockets connection

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

    public void updateConnection() throws IOException {


    Socket connection = server.accept();

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

    ServerClient client = new ServerClient(connection);

    clientsWaiting.add(client);

}

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

2 个答案:

答案 0 :(得分:2)

您最好的选择是让您的游戏在单独的线程中检查传入的套接字连接。您可以创建一个只能连续监听连接的Runnable

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

请注意,编写要在多个线程上运行的代码有很多陷阱。 Java提供了一些工具来最小化潜在的问题,但程序员必须确保您的代码是线程安全的。详细了解有关并行编程的许多问题超出了本问题的范围。我建议你对它进行一些研究,因为这种类型的编程产生的错误有时难以重现和跟踪。

既然我已经给你这个免责声明,使用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();

你会在游戏循环之前放置它,它会产生一个线程,可以在不中断你的游戏的情况下监听连接。关于如何使用Socket来跟踪它们来处理ThreadPool,每次建立新连接时产生一个新的Thread,有很多很好的习惯用法,所以我建议你对此进行一些研究。

祝你好运,这不是一条你想要冒险的简单道路。

答案 1 :(得分:1)

还有一个补充:当你建立TCP连接时,你不处理帧(UDP是基于帧的协议),你正在处理字节流。 下杠杆Byteoutpustream示例:

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 

因此,当客户端完成写入,但流仍处于打开状态时,您的读取方法会阻塞。如果您希望来自客户的某些数据,您可以阅读它然后调用您的打印方法,或者您想要通知等...