如何为多个客户端编写java TCP对象传输

Posted

技术标签:

【中文标题】如何为多个客户端编写java TCP对象传输【英文标题】:How to write java TCP object transmission for multiple clients 【发布时间】:2014-01-08 03:47:23 【问题描述】:

我正在编写一个原始的类似图形 MUD 的在线游戏,仅使用 Java 标准库 - 仅使用 Swing 和 TCP 套接字(用于学校和娱乐)。游戏有一个服务器(我壁橱里的一台备用笔记本电脑),它接受来自玩家的 TCP 连接并接收对象(使用 ObjectInputStream) - 聊天字符串和丢弃的物品等 - 并使用这些对象对虚拟世界进行更改,然后转发给其他玩家。

最初,我认为我可以通过让我的服务器的主线程使用循环监听他们的每个连接,让每个玩家连接到我服务器上的同一个 TCP 端口(端口 5010),就像这样......

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 上)时,我无法通过 IOExceptions,例如绑定异常和“java.net.SocketException:套接字已关闭”。

显然我这样做的方式不起作用,也许我需要为每个玩家分配一个唯一的端口号,而不是让每个玩家都尝试连接到端口 5010,或者可能是因为我正在使用我的将笔记本电脑编码为客户端和服务器。

不幸的是,我不知道自己在做什么——一个学期前我刚刚宣布计算机科学为我的专业。请解释如何为这样的虚拟世界构建网络连接,并避免在客户端应用程序和服务器之间的初始连接后立即发生的 IOExceptions,因为服务器再次开始在端口 5010 上侦听新连接主线程。

【问题讨论】:

好吧,您在打开插座后直接关闭它。这是你的第一个问题。 你试过oracle网络教程吗? 是的,但它更像是略读而不是彻底阅读。 除了小小的技术细节之外,我很好奇整体设计中是否有任何大的漏洞。例如,如果 TCP 对于同时向许多不同的玩家发送数据是一个糟糕的设计选择——也许我应该改用 UDP Multisocket。或者 UDP 可能是一个糟糕的选择,因为 UDP 信号不太可能通过无线调制解调器、防火墙和 TCP 信号的一种方式。那些可预见的大问题。 【参考方案1】:

试试这个

serversocket = new ServerSocket(5010);

while (true)

    socket = serversocket.accept();


    //proceed to log in player using their computer's host name.
 
serversocket.close();

我不会向您展示您将面临的其他问题,但这至少应该让您继续前进。

【讨论】:

但我读到ServerSocket仅用于建立连接。 服务器套接字始终保持打开状态。它正在侦听连接。客户端可以连接到侦听套接字。服务器无法连接到客户端套接字。这就是 TCP 的工作原理。 哦,我明白了。 ServerSocket 对象不只是创建一个连接,然后在每次需要新连接时被一个新连接替换。 欢迎来到兔子洞。是的,你是对的。如果您需要答案,请发布更多内容。

以上是关于如何为多个客户端编写java TCP对象传输的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Java 库编写黄瓜验收

Java 客户端混合 TCP 和 UDP 功能

Qt编写的项目作品19-图片及视频TCP/UDP网络传输

使用 AIDL 编写 Android 服务时如何为客户端分发自定义类

如何为 Lotus Notes 编写和使用 Java 代理

Java TCP协议传输