0

我有一个 Socket 服务器等待客户端以 json 格式发送消息。我不需要将数据存储到数据库中,但现在,我想将它们保存在哈希表中。因此,当客户端发送消息时,服务器会将其添加到哈希表中,而不会丢失之前的消息。

这是我的哈希表的声明:

private static Hashtable<Integer,String> table = new Hashtable<Integer,String>();

以下是称为消息到达服务器的方法:

    private void HashTable(String string){
    //JsonArray questions =  new JsonArray();
    //questions = string;
    //for(int i = 0; i < questions.length(); i++) {
        //JsonObject question = questions.getJsonObject(i);
        JSONObject jsonObj;
        try {
            jsonObj = new JSONObject(string);
            int id = jsonObj.optInt("DeviceID", -1);
            String name = jsonObj.toString();
            table.put(id, name);
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    //}
}

上面的代码没有保留以前消息中的数据。有人可以给个提示吗?

谢谢你

4

2 回答 2

2

int id = 1;- 你永远不会改变它,所以你所做的只是每次都替换 ID 1 的条目。您需要一个唯一的 ID 生成器,或者只是在id每次添加条目时递增。

编辑:正如评论者正确指出的那样,你应该使用HashMapnot HashTable,你真的不应该调用你的方法Hashtable......

编辑 2:好吧,您更改了代码示例,因此这不再准确,但现在发生的事情要么DeviceID不存在,要么-1您得到相同的设备 ID。当然,您说您想存储来自同一设备的多条消息,因此单独使用设备 ID 并不是您想要做的。您可能应该有某种消息 ID,最有可能在设备上生成,并以某种方式合并设备 ID 以帮助确保它是唯一的。

于 2013-03-05T20:10:50.583 回答
1

那是因为,当 Json 中的“DeviceId”为空时,您最终将始终使用相同的键“1”进行存储。因此它替换了旧值。

解决方案

private static AtomicInteger count = new AtomicInteger ;

在您插入哈希表的地方适应

int id = jsonObj.optInt("DeviceID", count.addAndGet(1) );
于 2013-03-05T20:22:38.717 回答