Java套接字 - 将对象绑定到IP

时间:2015-12-07 21:33:38

标签: java sockets hashmap

我正在尝试处理游戏的控制器(如分屏游戏,许多控制器,一个屏幕/游戏),但不知怎的,我不知道这样做的最佳做法是什么?目前我试图通过套接字的IP地址来命令播放器对象,这样每个控制器都可以控制严格的播放器,但不知怎的,我将相同的IP绑定到多个播放器(通过引用错误复制?):

public class PlayerMapper {

    public static final Logger LOGGER = LogManager.getLogger(PlayerMapper.class.getName());

    private static final Map<byte[], Player> players = new HashMap<>();

    public static synchronized Player getPlayer(final InetAddress paramInetAddress) {
        return players.get(paramInetAddress.getAddress());
    }

    public static synchronized void addPlayer(final InetAddress paramInetAddress, final String paramName) {
        final byte[] address = paramInetAddress.getAddress();
        final Player player = players.get(address);
        if (null == player) {
            players.put(address, new Player(paramName));
        } else {
            LOGGER.debug("Player \"{}\" already connected!", player.getName());
        }
    }
}

使用相同的“控制器”又名“127.0.0.1”进行5次测试会导致5个不同的播放器,HashMap中的键值都相同,但参考不同,即使我复制了字节IP地址的数组?

2 个答案:

答案 0 :(得分:3)

数组继承默认的Object hashCode()equals()方法。 Object#hashCode()从对象的内存地址生成哈希码,Object#equals()只比较对象标识(它们是同一个对象)。

因此,即使两个数组具有相同的内容,它们也会被视为HashMap中的不同键。要将数组用作HashMap键,您必须将它们包装在对象中,并提供自定义hashCode()equals()实现。

答案 1 :(得分:0)

数组没有equals方法(嗯,他们这样做,但实现是脑死亡的),所以你最终比较引用,它们是不同的。

尝试使用paramInetAddress本身作为密钥,而不是.getAddress