Aic*_*ich 1 java comparison bytearray serversocket hashmap
我正在用Java编写一个用于AS3中的MMORPG的套接字服务器.我对HashMap.get(byte [])的奇怪行为有一些问题.什么东西可能导致以下问题?
我不使用任何序列化系统,我发送字节,客户端和服务器都知道如何处理接收字节的字节数.客户端发出的第一个请求是要求服务器创建一个播放会话.服务器将生成一个随机会话令牌,作为byte [],包含8个条目,并将令牌添加到HashMap.响应将是9个字节长.第一个定义响应类型(在本例中为字节'+',表示"您已被接受.这是您的令牌.")和字节2-9是令牌.客户端必须存储令牌并将其附加到任何进一步的请求(此概念可以与PHP会话进行比较).
这是将客户端添加到HashMap的代码:
byte[] token = Util.generateToken();
// f is ResultSet entry of JDCB SQL query return value
Client client = new Client(f.getInt("id"), token);
Core.clients.put(token, client);
// I display client.token instead of token to make sure client != null
Log.log("User " + f.getString("name") + " has logged in with session token " + Util.getHexString(client.token) + ".");
Run Code Online (Sandbox Code Playgroud)
日志:
[01:50:30]用户已使用会话令牌92登录:B7:F8:C6:4B:53:17:3A.
这些是一些调试行,将在任何进一步的请求中显示:
// Show (byte[]) Token as Hex String, 8 bytes long
Log.soc("Token: " + Util.getHexString(buffer.getBytes(1, 9)));
// Show all keys in (HashMap<byte[], client>) Core.clients
int it = 0;
for (byte[] b : Core.clients.keySet())
Log.soc("Key Core.clients #" + StringUtils.leftPad(String.valueOf(++it), 2, '0') + " = " + Util.getHexString((b)));
// Display availability bool to make sure
Log.soc(Core.clients.containsKey(buffer.getBytes(1, 9)));
// Get Core.clients value where key = Token
Log.soc("Client: " + Core.clients.get(buffer.getBytes(1, 9)));
Run Code Online (Sandbox Code Playgroud)
日志:
[01:51:09]令牌:92:B7:F8:C6:4B:53:17:3A
[01:51:09] Key Core.clients#01 = 92:B7:F8:C6:4B:53:17:3A
[01:51:09]假
[01:51:09]客户:null
那么,我怎么能找出出了什么问题呢?
HashMap使用hashCode()和equals()查找给定键的条目.字节数组只会等于它自己.即使其他字节数组具有相同的长度和相同的字节,它也不会等于另一个字节数组.您应该将数组包装在Key类中,该类重写equals()并hashCode()使其工作.