Java Socket - 将对象绑定(bind)到 IP

标签 java sockets hashmap

我正在尝试处理游戏的 Controller (例如分屏游戏,许多 Controller ,一个屏幕/游戏),但不知何故我不知道执行此操作的最佳实践是什么?目前,我正在尝试通过套接字的 IP 地址来命令 Player 对象,以便每个 Controller 控制右侧的 Player,但不知何故,我将相同的 IP 绑定(bind)到多个 Player(通过引用复制错误?):

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());
        }
    }
}

使用相同的“ Controller ”又名“127.0.0.1”测试 5 次,结果是 5 个不同的玩家,HashMap 中键的值都是相同的,但引用不同,即使我复制字节IP 地址数组?

最佳答案

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

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

关于Java Socket - 将对象绑定(bind)到 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34143645/

相关文章:

java - android中java.net.Socket的默认超时值是多少?

java - 没有堆栈跟踪的 NullPointerException

java - java中的多线程

java - 如何使用JRE部署JavaFX 11 Desktop应用程序

c# - 通过TCP连接到多个客户端的服务

c - 接收多条消息的socket编程C

java - 比较 Java 中的 HashMap

java - 在java中对二维数据结构进行排序

java - 通过对象 HashMap (java) 进行具有保存功能的设置的 GUI

java - 将 zip 文件编码为 Base64,而不在文件系统上写入 zip