java - 使用多客户端编写简单的 Java Socket 服务器游戏

标签 java sockets server 2d-games

我正在尝试使用多客户端服务器编写一个简单的java应用程序。我的第一步很成功。我编写了在控制台中与多个客户端一起运行的简单应用程序。像简单的聊天之类的东西。

现在我正在从事另一个更复杂的项目。我编写了简单的 GUI 程序,其中有带有移动矩形的板。每个玩家都由他自己的矩形代表,他可以在棋盘上移动该矩形。我的目标是,如果其他玩家加入服务器,我将能够在棋盘上看到他。

我也写过服务器程序。当服务器正在运行并且玩家启动应用程序时,他会尝试连接到游戏服务器。如果连接成功,服务器将启动代表每个客户端(玩家)的新线程。然后Player从Server接收uID,然后将他的Player对象发送到Server ArrayList,该ArrayList存储所有连接的玩家。

到目前为止,一切都很好,因为玩家和服务器之间的数据传输仅按特定顺序调用一次(从服务器获取 uID,然后将 Player 对象发送到服务器 ArrayList)。

我的问题从这里开始。我编写了其他服务器和播放器方法来发送和接收数据。

主程序有自己的游戏线程和简单的游戏循环。玩家发送和接收方法都在这个游戏循环中。

在另一个站点上,我有 clientThread,它也有服务器发送和接收方法的循环。

当我运行客户端(游戏)时,我有这个堆栈跟踪:

  java.net.SocketException: Socket closed
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:116)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
    at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1877)
    at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1786)
    at java.io.ObjectOutputStream.<init>(ObjectOutputStream.java:247)
    at GUI.GameBoard.sendData(GameBoard.java:193)
    at GUI.GameBoard.run(GameBoard.java:74)
    at java.lang.Thread.run(Thread.java:745)
java.net.SocketException: socket closed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at java.net.SocketInputStream.read(SocketInputStream.java:170)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2313)
    at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2326)
    at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2797)
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:802)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
    at GUI.GameBoard.getServerData(GameBoard.java:181)
    at GUI.GameBoard.run(GameBoard.java:75)
    at java.lang.Thread.run(Thread.java:745)

我没有关闭任何套接字。我猜测问题可能出在服务器和客户端之间的同步数据传输。

有什么建议吗?也许有一些很好的教程(在循环中将对象发送到服务器)?

最佳答案

  java.net.SocketException: Socket closed

这只有一个含义。您关闭了套接字,然后继续使用它。

代码中的错误。

I'm not closing any Socket.

是的,你是。您可能不知道关闭从套接字获取的输入流或输出流会关闭另一个流和套接字。

I guess that the problem may be synchronizing data transfer between server and client.

与此无关。

关于java - 使用多客户端编写简单的 Java Socket 服务器游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32685484/

相关文章:

node.js - 具有 nginx 和基本身份验证的 Node.js 服务器

ssl - Opensips Tls 和证书问题

ubuntu - Jenkins 无法配置?

java - 用于提取(仅)第一个数值的正则表达式

java - hibernate 搜索: Cannot do a wild card search on a dynamically mapped field text fields

java - 使用 Java 填写表格,可能控制浏览器?

Java Socket - 如何捕获 BufferedReader.readline() 的异常

java - 渐变 : not installed (cordova requirements)

c# - 多个客户端异步连接,同步发送/接收

ios - 如何在 iOS 中进行套接字池?