我正在编写一个原始的图形MUD类在线游戏,只使用Java标准库 - 只需Swing和TCP套接字(用于学校和娱乐)。游戏中有一台服务器(我的壁橱里有一台备用笔记本电脑)接受来自玩家的TCP连接并接收对象(使用ObjectInputStream) - 聊天字符串和丢弃的项目等 - 并使用这些对象对虚拟世界进行更改转发给其他玩家。
最初,我以为我可以通过让我的服务器的主线程使用循环监听每个连接来让每个玩家连接到我的服务器(端口5010)上的相同TCP端口,就像这样...
while (true)
{
//get new connection
serversocket = new ServerSocket(5010);
socket = serversocket.accept();
serversocket.close();
//proceed to log in player using their computer's host name.
}
然后我将每个新玩家的TCP套接字连接传递给专用于该玩家的对象输入和输出的线程,如下所示:
new_thread = new Thread(new Server_Input_Thread(main_thread_socket));
当我调试时,我通过从其他笔记本电脑运行服务器端应用程序和客户端应用程序来测试游戏,并通过“localhost”连接。
但我遇到了问题。在初始连接(也在端口5010上)之后,在侦听新连接(在端口5010上)时,我无法通过诸如绑定异常和“java.net.SocketException:socket closed”之类的IOExceptions。
显然我正在做的方式不起作用,也许我需要为每个玩家分配一个唯一的端口号,而不是让每个玩家尝试连接到端口5010,或者可能是因为我正在使用我的将笔记本电脑编码为客户端和服务器。
对我来说不幸的是,我不知道我在做什么 - 我刚刚宣布计算机科学为我的主要学期一个学期。请解释如何为这样的虚拟世界构建网络连接,并避免在客户端应用程序和服务器之间的初始连接之后立即发生的IOExceptions,因为服务器开始再次在端口5010上侦听新连接。主线程。
答案 0 :(得分:3)
试试这个
serversocket = new ServerSocket(5010);
while (true)
{
socket = serversocket.accept();
//proceed to log in player using their computer's host name.
}
serversocket.close();
我不会向你展示你将面临的其他问题,但至少应该让你前进。