【问题标题】:Multithreaded server not accepting client outputstream多线程服务器不接受客户端输出流
【发布时间】:2012-10-20 02:35:26
【问题描述】:

我对线程世界有点陌生,我正在制作一个游戏服务器,将每个连接到另一个线程的客户端分配给我,这样我就可以在同一个端口上接受多个客户端。但是,我在客户端连接到服务器时遇到问题,但无法发送数据(以 ObjectOutputStream 的格式发送到服务器)。有什么可能出错的指示吗?

这是我的 MatchmakingServer.java 的代码

    try {
        listenForPlayers = new ServerSocket(portNumber);
        System.out.println("Port opened. Searching for players");
        while (true){
            Socket clientSocket = listenForPlayers.accept();
            Runnable r = new PlayerHandlerForServer(clientSocket);
            new Thread(r).start();
        }
    } catch (Exception e) { }

我的 PlayerHandler 对象实现了 Runnable,这是它的 run 方法。

private Player player;
private ObjectInputStream getPlayerData;
private static PrintWriter sendPlayerData;
private Socket socket;
public void run() {
    try {
        getPlayerData = new ObjectInputStream(socket.getInputStream());
        player = (Player) getPlayerData.readObject();
        //do stuff with the player object, this code get executed.
        sendPlayerData = new PrintWriter(socket.getOutputStream(),true);
        updatePlayersFound(sendPlayerData);
    } catch (Exception e) { }

}

【问题讨论】:

  • catch (Exception e) { } -- 为什么忽略异常?你不会开车带眼罩吧?
  • 哎呀。我让一个朋友看我的代码,他说默认的 e.printStackTrace() 没有做任何事情,但我猜它做了。我发现了我的错误(播放器不可序列化)。感谢您指出这一点!
  • 我强烈建议您以后不要将同一个朋友用作 Java 资源。他的建议非常危险。

标签: java sockets client client-server


【解决方案1】:

正如 cmets 日志中指出的异常,它们将提供线索,说明可能导致此问题的原因。

一个疯狂的猜测是你的 Player 类没有实现 Serializable 接口。

【讨论】:

  • 我接触过太多戴眼罩开车的人 :-)
【解决方案2】:

我想知道为什么您从 Socket 读取序列化对象,但使用 PrintWriter 写出数据。我建议使用 ObjectOutputStream 并保持一致。

发送序列化的对象可能是多余的。发送的数据可能比您关心的更多。这可能会对您的游戏客户端造成无用的网络延迟!您可能想看看使用 DataInputStream / DataOutputStream。这将允许您仅使用真正需要的内容来编写/读取对象。

【讨论】:

    猜你喜欢
    • 2013-04-29
    • 2016-10-05
    • 1970-01-01
    • 2014-12-21
    • 2011-04-28
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多