为了实现聊天室的传送在线列表 在服务端有一个静态的Hashtable或者HashMap ip地址做键,昵称为值, 每当客户端传来新的更改昵称请求时候重新调用put方法来覆盖 如若第一次上线 则有一个默认的昵称default strings发来存在哈希表里面
每当该哈希表发生更改 则给每个在线人发送一份新的在线列表Hashtable
因为是需要在多线程中来获取昵称修改哈希表 并且发送新的哈希表 而问题来了在线程中我输出来哈希表 里面是有键值对的但是当我将次哈希表发送到客户端 时 客户端接受到的哈希表是空的 就是哈希表在服务端的初始状态我怀疑是线程的问题 所以每当客户端连接的时候我就事先发送一个默认字符串给服务器 服务器修改哈希表的方法在一个线程的构造函数里面并没有在线程中 再次发送的话 客户端就可以接收到这第一次改变的哈希表 以后再次更改昵称的时候 就只能在线程中更改了 显然是没有结果的总而言之为什么无法在线程中更改静态Hashtable的键值对 感觉又回到了当初 引用类型和值类型的问题 郁闷
每当该哈希表发生更改 则给每个在线人发送一份新的在线列表Hashtable
因为是需要在多线程中来获取昵称修改哈希表 并且发送新的哈希表 而问题来了在线程中我输出来哈希表 里面是有键值对的但是当我将次哈希表发送到客户端 时 客户端接受到的哈希表是空的 就是哈希表在服务端的初始状态我怀疑是线程的问题 所以每当客户端连接的时候我就事先发送一个默认字符串给服务器 服务器修改哈希表的方法在一个线程的构造函数里面并没有在线程中 再次发送的话 客户端就可以接收到这第一次改变的哈希表 以后再次更改昵称的时候 就只能在线程中更改了 显然是没有结果的总而言之为什么无法在线程中更改静态Hashtable的键值对 感觉又回到了当初 引用类型和值类型的问题 郁闷
比如,某人改了昵称,你只发这个这个修改了的昵称和ID,在客户端再根据这个昵称和ID修改自己的HashTable.
HashMap不同步,需要自己维护同步。
ConcurrentHashMap是多线程增强版。
服务器端维护一个在线用户列表Vector,客户端在登录时将用户名发到服务器端,服务器端将用户名加入Vector中,并把更新后的Vector发给每个客户端,客户端更新自己的在线用户列表JList。问题是:加入分别有3个用户A、B、C按先后顺序登陆,则ABC的在线用户列表分别显示的是[A],[A,B],[A,B,C]。也就是说不能更新在它之前登陆用户的在线列表。调试的时候,发现服务器端Vector在写入流中之前都是更新后的状态,例如,C登陆时,服务器的Vector就变成[A,B,C],但A,B接收的内容却不变。十分不解。
应该是服务器端多线程的原因吧
response.Flush() 写了吧?