有关网络编程的问题

Jerryup 2013-06-02 03:46:45
我初学java,最近看韩顺平的网络编程,有个问题,客户端的socket用static修饰,做成静态的,也就是不管有多少客户端登录,都共享一个socket,服务器端把每个与客户端建立的连接保存在hashmap中,转发的时候再找到对应的socket,但是客户端共享一个socket,在接收服务器发来的消息时是怎么区分的呢?
...全文
262 15 打赏 收藏 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010748764 2013-06-04
  • 打赏
  • 举报
回复
用多线程。。每个用户连接时建个SOCKET。。一对一。。不知道有上万用户会不会卡死机呢。。。哈哈,,,, 用单线程肯定是不行的。。。非阻式的SOCKET 好像可以单线程。。不知道效果好不好。。 每个用户进来时都会在哈希表或者数据库里保存用户名+对应的SOCKET对象,,别的用户要发送XX给他。先发服务器。。服务器里找哈希表对应数据。用对应用户SOCKET重置输出流发过去就行了。。对方下线就关闭那个SOCKET。。上线又重建一个SOCKET写进哈希表。。每个用户一一对应的。。 我也刚学的。。哈哈。。第一次用JAVA写QQ类似的聊天软件。。 现在遇到一个问题。。求高人指点。。 就是每个好友都会新建一个聊天窗口。。服务端转发不同用户的信自己给某个客户端。。怎么把不同好友信息分发给对应的好友聊天窗口。。我接收过来。。所有好友窗口都显示相同的内容。。晕死。。一天了。。没找到方法解决。。 发过来的数据带有用户名和聊天内容。。是可以区分开的。。唯一的问题就是怎么让对应的好友窗口显示出来。。。窗口之间用户名不同。。 我思考了下。。SOCKET 可以传送对象的。。。如果我服务器里的哈希表对应的用户+SOCKET传送给客户端,,,让他们点对点进行。。这样服务器减负了。。对应好友窗口一对一聊天也行了。。 就是不知道怎么写成代码。。。是否可行? 大神们。。指点一二吧。。。
n27741 2013-06-04
  • 打赏
  • 举报
回复
引用 8 楼 Jerryup 的回复:
[ [quote=引用 7 楼 N27741 的回复:] 我是用 打电话 来理解的。 1、每个客户端有个电话号码,打给服务器 ,告诉他你要找的 另一个 或多个 电话号码。 服务器帮你找到,并把你的消息告诉其他的电话号码。 2、这个电话机 可以抽象成一个socket 电话号码类似里面的Ip+端口 服务器就是电信公司。 3、电信公司只要维护一个电话号码的集合(socket ,clientID ). 4、电信公司等待客户拨过来,然后 按要求 接通被叫的客户端。
这个比喻不错,但是还是有点出入,电话机比作是socket,但是一个客户端登录后,并没有释放这个socket,还有第二个,第三个用这个通道socket登录,这怎么解释呢?[/quote] 电话就哪里摆着,只要能获取到,谁打都一样,登陆和socket没关系就像 说什么事情和电话无关,只和说事的人有关系一样。比如,你家里电话拨通到你亲戚家,你可以问好,然后你父母依次通过电话问好。 电话只有一个 (当然 电话也是比较贵的,所以只限制一个,socket的创建也是要消耗资源的,所以共享),客户端可以有多个。
n27741 2013-06-04
  • 打赏
  • 举报
回复
引用 14 楼 Jerryup 的回复:
[quote=引用 12 楼 N27741 的回复:] [quote=引用 8 楼 Jerryup 的回复:] [ [quote=引用 7 楼 N27741 的回复:] 我是用 打电话 来理解的。 1、每个客户端有个电话号码,打给服务器 ,告诉他你要找的 另一个 或多个 电话号码。 服务器帮你找到,并把你的消息告诉其他的电话号码。 2、这个电话机 可以抽象成一个socket 电话号码类似里面的Ip+端口 服务器就是电信公司。 3、电信公司只要维护一个电话号码的集合(socket ,clientID ). 4、电信公司等待客户拨过来,然后 按要求 接通被叫的客户端。
这个比喻不错,但是还是有点出入,电话机比作是socket,但是一个客户端登录后,并没有释放这个socket,还有第二个,第三个用这个通道socket登录,这怎么解释呢?[/quote] 电话就哪里摆着,只要能获取到,谁打都一样,登陆和socket没关系就像 说什么事情和电话无关,只和说事的人有关系一样。比如,你家里电话拨通到你亲戚家,你可以问好,然后你父母依次通过电话问好。 电话只有一个 (当然 电话也是比较贵的,所以只限制一个,socket的创建也是要消耗资源的,所以共享),客户端可以有多个。 [/quote]"比如,你家里电话拨通到你亲戚家,你可以问好,然后你父母依次通过电话问好。"如果“依次打电话”还是同一个socket吗? [/quote] 你吧电话拨通,你问好了,然后吧话筒给你父母,他们继续他们的通讯。 最后 你吧电话挂掉。通讯结束。一个socket
Jerryup 2013-06-04
  • 打赏
  • 举报
回复
引用 10 楼 ysjian_pingcx 的回复:
打个比方,我们用自己的手机拨打自己的手机时,是不可能行得通的~
请问有什么关系呢?
Jerryup 2013-06-04
  • 打赏
  • 举报
回复
引用 12 楼 N27741 的回复:
[quote=引用 8 楼 Jerryup 的回复:] [ [quote=引用 7 楼 N27741 的回复:] 我是用 打电话 来理解的。 1、每个客户端有个电话号码,打给服务器 ,告诉他你要找的 另一个 或多个 电话号码。 服务器帮你找到,并把你的消息告诉其他的电话号码。 2、这个电话机 可以抽象成一个socket 电话号码类似里面的Ip+端口 服务器就是电信公司。 3、电信公司只要维护一个电话号码的集合(socket ,clientID ). 4、电信公司等待客户拨过来,然后 按要求 接通被叫的客户端。
这个比喻不错,但是还是有点出入,电话机比作是socket,但是一个客户端登录后,并没有释放这个socket,还有第二个,第三个用这个通道socket登录,这怎么解释呢?[/quote] 电话就哪里摆着,只要能获取到,谁打都一样,登陆和socket没关系就像 说什么事情和电话无关,只和说事的人有关系一样。比如,你家里电话拨通到你亲戚家,你可以问好,然后你父母依次通过电话问好。 电话只有一个 (当然 电话也是比较贵的,所以只限制一个,socket的创建也是要消耗资源的,所以共享),客户端可以有多个。 [/quote]"比如,你家里电话拨通到你亲戚家,你可以问好,然后你父母依次通过电话问好。"如果“依次打电话”还是同一个socket吗?
袁慎建 2013-06-03
  • 打赏
  • 举报
回复
打个比方,我们用自己的手机拨打自己的手机时,是不可能行得通的~
u010178674 2013-06-03
  • 打赏
  • 举报
回复
不知道
Jerryup 2013-06-03
  • 打赏
  • 举报
回复
[
引用 7 楼 N27741 的回复:
我是用 打电话 来理解的。 1、每个客户端有个电话号码,打给服务器 ,告诉他你要找的 另一个 或多个 电话号码。 服务器帮你找到,并把你的消息告诉其他的电话号码。 2、这个电话机 可以抽象成一个socket 电话号码类似里面的Ip+端口 服务器就是电信公司。 3、电信公司只要维护一个电话号码的集合(socket ,clientID ). 4、电信公司等待客户拨过来,然后 按要求 接通被叫的客户端。
这个比喻不错,但是还是有点出入,电话机比作是socket,但是一个客户端登录后,并没有释放这个socket,还有第二个,第三个用这个通道socket登录,这怎么解释呢?
Jerryup 2013-06-03
  • 打赏
  • 举报
回复
引用 1 楼 xiars123 的回复:
[quote=引用 楼主 Jerryup 的回复:] 我初学java,最近看韩顺平的网络编程,有个问题,客户端的socket用static修饰,做成静态的,也就是不管有多少客户端登录,都共享一个socket,服务器端把每个与客户端建立的连接保存在hashmap中,转发的时候再找到对应的socket,但是客户端共享一个socket,在接收服务器发来的消息时是怎么区分的呢?
虽然没怎么用过socket,但是客户端socket用static是为了让这个客户端的socket使用同一个,但是一个server可以接多个client,socket要做到唯一标识client,所以需要区分开,区分的方法多的是。。[/quote]请问static socket只有一个共享连接通道,怎么能做到唯一标识client?能否详细解释一下?
Jerryup 2013-06-03
  • 打赏
  • 举报
回复
我还是有点不理解,所有的客户端在接收服务器传来的信息时,都经过共享的那个static socket,从这个socket的输出流出来的信息,怎么传到对应的客户端上?
n27741 2013-06-03
  • 打赏
  • 举报
回复
我是用 打电话 来理解的。 1、每个客户端有个电话号码,打给服务器 ,告诉他你要找的 另一个 或多个 电话号码。 服务器帮你找到,并把你的消息告诉其他的电话号码。 2、这个电话机 可以抽象成一个socket 电话号码类似里面的Ip+端口 服务器就是电信公司。 3、电信公司只要维护一个电话号码的集合(socket ,clientID). 4、电信公司等待客户拨过来,然后 按要求 接通被叫的客户端。
xiars123 2013-06-03
  • 打赏
  • 举报
回复
我能想到的就是每个client过来server起一个线程单独跑,期待java通信方面经验丰富的大咖作答。
wandefajin 2013-06-02
  • 打赏
  • 举报
回复
服务端可以获取到客户端的socket 通过客户端的流进行传输 每个都是不一样的 所以没有问题!!!
火影之贺 2013-06-02
  • 打赏
  • 举报
回复
客户端收到的响应是由它的请求决定的,不需要区分。 客户端发请求1,收到对应的响应1;同时客户端发请求2,收到对应的响应2。 你可以理解成: 请求里是有个序号的,请求1的序号是1;请求2的序号是2; 对应的响应里也有序号,响应1和响应2,那么自然响应1对应请求1,响应2对应请求2。 response = send(request);你的request1一定是得到response1。这是有网络的底层决定,不需要你关心。
xiars123 2013-06-02
  • 打赏
  • 举报
回复
引用 楼主 Jerryup 的回复:
我初学java,最近看韩顺平的网络编程,有个问题,客户端的socket用static修饰,做成静态的,也就是不管有多少客户端登录,都共享一个socket,服务器端把每个与客户端建立的连接保存在hashmap中,转发的时候再找到对应的socket,但是客户端共享一个socket,在接收服务器发来的消息时是怎么区分的呢?
虽然没怎么用过socket,但是客户端socket用static是为了让这个客户端的socket使用同一个,但是一个server可以接多个client,socket要做到唯一标识client,所以需要区分开,区分的方法多的是。。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧