Java 服务器正在等待客户端响应
Java server is waiting for client response
我从事游戏开发已有一段时间了,我正在尝试制作我的下一款多人游戏。我正在尝试编写一个服务器,每 1/16 秒左右循环一次,以计算游戏中所有实体等的位置。然后,客户端将能够在需要时请求所有这些信息。
因此,我试着写了一个简单的server/client,可以交换信息。部分代码可以看这里:
ServerSocket listener;
Socket socket;
while(running)
{
socket = listener.accept();
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("information"); //sending the string "information" to any client that has connected
}
唯一的问题是每次调用 listener.accept() 时服务器都会等待客户端连接,因此会停止循环中需要完成的所有其他操作。我怎样才能让许多客户端可以 connect/request 信息,而服务器每次都不会停止专门监听它们?当涉及到所有这些网络方面的东西时,我真的没有太多线索,这就是我努力学习的原因。我从来没有深入研究过它,所以如果这是一个看似简单的解决方案,我深表歉意。
(希望我对游戏在这里的工作方式有正确的想法?我认为位置和一切都是服务器端的,客户端处理的唯一事情是渲染和用户输入以及这样。)
如果这是一个简单的解决方案,您应该考虑简单地多线程处理请求,因此每个侦听器都与主程序代码分开运行:http://tutorials.jenkov.com/java-multithreaded-servers/multithreaded-server.html
此外,如果游戏涉及精确的动作,例如射击,你应该考虑稍微快一点的tickrate。
您需要切换到 NIO
,它提供非阻塞功能:
class Server {
public static void main(String[] args) {
try {
ServerSocketChannel serverSocket = ServerSocketChannel.open();
serverSocket.configureBlocking(false);
serverSocket.bind(port);
while(running) {
SocketChannel channel = serverSocket.accept();
//...
}
}
}
}
当serverSocket.accept()
被调用时,如果没有连接接受,它会return null
,而不是阻塞。
您还可以使用 Selector
在单个线程上管理 reading/writing 和接受。请记住,您还需要为每个用户创建一个线程以阻止阅读。相反,Selector
会在您需要从任何频道阅读时通知您。
我从事游戏开发已有一段时间了,我正在尝试制作我的下一款多人游戏。我正在尝试编写一个服务器,每 1/16 秒左右循环一次,以计算游戏中所有实体等的位置。然后,客户端将能够在需要时请求所有这些信息。
因此,我试着写了一个简单的server/client,可以交换信息。部分代码可以看这里:
ServerSocket listener;
Socket socket;
while(running)
{
socket = listener.accept();
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("information"); //sending the string "information" to any client that has connected
}
唯一的问题是每次调用 listener.accept() 时服务器都会等待客户端连接,因此会停止循环中需要完成的所有其他操作。我怎样才能让许多客户端可以 connect/request 信息,而服务器每次都不会停止专门监听它们?当涉及到所有这些网络方面的东西时,我真的没有太多线索,这就是我努力学习的原因。我从来没有深入研究过它,所以如果这是一个看似简单的解决方案,我深表歉意。
(希望我对游戏在这里的工作方式有正确的想法?我认为位置和一切都是服务器端的,客户端处理的唯一事情是渲染和用户输入以及这样。)
如果这是一个简单的解决方案,您应该考虑简单地多线程处理请求,因此每个侦听器都与主程序代码分开运行:http://tutorials.jenkov.com/java-multithreaded-servers/multithreaded-server.html
此外,如果游戏涉及精确的动作,例如射击,你应该考虑稍微快一点的tickrate。
您需要切换到 NIO
,它提供非阻塞功能:
class Server {
public static void main(String[] args) {
try {
ServerSocketChannel serverSocket = ServerSocketChannel.open();
serverSocket.configureBlocking(false);
serverSocket.bind(port);
while(running) {
SocketChannel channel = serverSocket.accept();
//...
}
}
}
}
当serverSocket.accept()
被调用时,如果没有连接接受,它会return null
,而不是阻塞。
您还可以使用 Selector
在单个线程上管理 reading/writing 和接受。请记住,您还需要为每个用户创建一个线程以阻止阅读。相反,Selector
会在您需要从任何频道阅读时通知您。