SOCKET服务器端和客户端的区别,请说得清楚的人进

hphull 2008-11-16 05:34:37
用SOCKET实现TCP连接,我要使用1台PC去控制另外100台PC(控制让100台机器显示特定的信息等)。
一种做法是100台PC每个建立一个SOCKET监听,然后用那一台去逐IP连接。建立连接后再去控制。
另一种做法是,那1台PC建立SOCKET监听,100PC主动去建立连接。

首先,我很想想明白,这样两种实现各自的优缺点。换种问法是,SOCKET服务器适合跑哪类程序,而客户端又适合跑哪类程序,因为我自己想不通第一种方法和第二种方法各有什么利弊。这也引出了第二个问题。

===============================================================

第二个问题是,如果用第一种方法,相当于是那1台PC随机开放了100个端口,每一个端口去连接一个客户机。而100个客户机的端口是固定的。
如果是第二种做法,则那1台PC的端口是固定的,100台PC各自的端口则是不尽相同的。如果这1台和那100台是在不同的网段内,中间由路由器相连,那么两种做法对路由器的参数配置上来说各该如何配置。

未做过相关的项目,请前辈给出建议。
...全文
2173 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rain7758 2008-12-31
  • 打赏
  • 举报
回复 1
[Quote=引用 11 楼 patyonline 的回复:]
这个还用说,当然是第二种好啦,
第一,你的客户机可能是不确定的,也可能以后再加入客户机,要是再加入客户机,你服务器程序不是要重写?
第二,你服务器去主动连接客户机,可能很多客户机没开机,或是别的原因不能连上,那服务器不是一直要去试着去连接,
那样不是又浪费服务器很多资源,要是程序写得不好的话,还可能堵塞网络,所以呢,当然是第二种啦,
[/Quote]

常规方法当然是一台做服务器,其他的机器去连。
理由似乎很多。
防火墙来说,难道要把100台客户端当作服务器暴露出来?
arust 2008-12-30
  • 打赏
  • 举报
回复
我现在也遇到了类似的问题,我发现如果用一个客户端去连接多个服务器的话,然后进行控制,至少在编程方面,实现起来比较困难,1台PC建立SOCKET监听,100PC主动去建立连接,这种实现方式相对容易一些。
sinovoice 2008-12-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 unsigned 的回复:]
两种方式其中都差不多,并没有本质的区别.不过个人更建议主控机器作为服务器,其它作为客户端.原因在于,监听需要一个固定的端口,相比之下在一台机器上保证一个端口不冲突,远比在众多机器当中保证端口不冲突来得容易.
[/Quote]

需要一台机器一个端口吗?这点不是很清楚.
weichaichang 2008-12-29
  • 打赏
  • 举报
回复
当然是1台机器建立监听,让100台去访问了。这时常规方法。通信是相互的,客户端当然也向服务器端发送信息的。
WillingBug 2008-12-27
  • 打赏
  • 举报
回复
只说两种方法的会遇到的一些问题吧!
第一种方法:你要事先知道每台主机的IP信息(端口就不用说了),可先事先做一下全网的扫描看看哪些你可以控制,但这种方法仅限于你的控控制端能直接找被控制端,比较NAT网络中,NAT网络外的机器是无法直接连接NAT内部的机器的。
第二种方法:可以解决NAT网络情况的问题同时也不用扫描获得所有可控制的机器,每个被控的机器要预先设定一个IP去连接,也就是说控制端必须以这个IP做为地址否则无法得到客户端信息。

两种可以结合使用,但成本比较大。
patyonline 2008-12-27
  • 打赏
  • 举报
回复
这个还用说,当然是第二种好啦,
第一,你的客户机可能是不确定的,也可能以后再加入客户机,要是再加入客户机,你服务器程序不是要重写?
第二,你服务器去主动连接客户机,可能很多客户机没开机,或是别的原因不能连上,那服务器不是一直要去试着去连接,
那样不是又浪费服务器很多资源,要是程序写得不好的话,还可能堵塞网络,所以呢,当然是第二种啦,
yc_8301 2008-11-19
  • 打赏
  • 举报
回复
凭感觉第2种比较好。。
不明原理,还等待高手回答。。
关注中。。。
fengzhren 2008-11-18
  • 打赏
  • 举报
回复
基于NAT穿透问题方面的考虑,建议使用第一种方法,这样你只要保证服务器IP对各个客户端是有效的就可以了,可以理解为服务器于公网上,谁都可以找到;如果第二种的话,你要保证每个客户端都要对服务器可见,这样你就不要想把客户端放到内网了,除非你要做的只是个内网的传输控制。
tingtj 2008-11-18
  • 打赏
  • 举报
回复
局域网上组个组播就可以了
-----------------------------------------------
http://www.wantsoft.com
隐形者软件代码交流博客
-----------------------------------------------
achao9527 2008-11-18
  • 打赏
  • 举报
回复
多点是udp。tcp是单点型!
scq2099yt 2008-11-17
  • 打赏
  • 举报
回复
感觉第1种方法更符合常理。
hphull 2008-11-17
  • 打赏
  • 举报
回复
如果说并没有太大的区别,那么主要考虑的防火墙设置的穿透问题.也就是说,用于控制的PC和被控制PC是在不同网段,而不同网段的连接一般使用路由多会对端口进行一定的屏蔽.我想问两种方法对于两个网段间的穿透来说有什么区别.
hphull 2008-11-17
  • 打赏
  • 举报
回复
如果说并没有太大的区别,那么主要考虑的防火墙设置的穿透问题.也就是说,用于控制的PC和被控制PC是在不同网段,而不同网段的连接一般使用路由多会对端口进行一定的屏蔽.我想问两种方法对于两个网段间的穿透来说有什么区别.
blackcat242 2008-11-16
  • 打赏
  • 举报
回复
这个东西是相对的,一般来说被动的是服务器,主动地是客户端
etz2008 2008-11-16
  • 打赏
  • 举报
回复
个人觉得做在客服端听
更适合多线程
服务端连接
这正是反向连接
过防火墙
僵哥 2008-11-16
  • 打赏
  • 举报
回复
两种方式其中都差不多,并没有本质的区别.不过个人更建议主控机器作为服务器,其它作为客户端.原因在于,监听需要一个固定的端口,相比之下在一台机器上保证一个端口不冲突,远比在众多机器当中保证端口不冲突来得容易.
java聊天室程序源码 2 需求分析 2.1 业务需求 1. 与聊天室成员一起聊天。 2. 可以与聊天室成员私聊。 3. 可以改变聊天内容风格。 4. 用户注册(含头像)、登录。 5. 服务器监控聊天内容。 6. 服务器过滤非法内容。 7. 服务器发送通知。 8. 服务器踢人。 9. 保存服务器日志。 10.保存用户聊天信息。 2.2 系统功能模块 2.2.1 服务器端 1.处理用户注册 2.处理用户登录 3.处理用户发送信息 4.处理用户得到信息 5.处理用户退出 2.2.2 客户端 1.用户注册界面及结果 2.用户登录界面及结果 3.用户发送信息界面及结果 4.用户得到信息界面及结果 5.用户退出界面及结果 2.3 性能需求 运行环境:Windows 9x、2000、xp、2003,Linux 必要环境:JDK 1.5 以上 硬件环境:CPU 400MHz以上,内存64MB以上 3.1.2 客户端结构 ChatClient.java 为客户端程序启动类,负责客户端的启动和退出。 Login.java 为客户端程序登录界面,负责用户帐号信息的验证与反馈。 Register.java 为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。 ChatRoom.java 为客户端程序聊天室主界面,负责接收、发送聊天内容与服务器端的Connection.java 亲密合作。 Windowclose 为ChatRoom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。 Clock.java 为客户端程序的一个小程序,实现的一个石英钟功能。 3. 2 系统实现原理 当用户聊天时,将当前用户名、聊天对象、聊天内容、聊天语气和是否私聊进行封装,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端 当用户发送聊天信息时,服务端将会收到客户端Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问。 接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,在本程序中设定的是3秒刷新服务器一次,如果间隔时间太短将会增加客户端服务器端的通信负担,而间隔时间长就会让人感觉没有时效性,所以经过权衡后认为3秒最佳,因为每个用户都不可能在3秒内连续发送信息。 当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息人性化地显示在聊天信息界面上。 4.1.1 问题陈述 1.接受用户注册信息并保存在一个基于文件的对象型数据库。 2.能够允许注册过的用户登陆聊天界面并可以聊天。 3.能够接受私聊信息并发送给特定的用户。 4.服务器运行在自定义的端口上#1001。 5.服务器监控用户列表和用户聊天信息(私聊除外)。 6.服务器踢人,发送通知。 7.服务器保存日志。
1、本课程是一个干货课程,主要讲解如何封装服务器底层,使用Tcp/ip长连接,IDE使用vs2019 c++开发以及使用c++11的一些标准,跨平台windows和linux,服务器性能高效,单服务器压力测试上万无压力,服务器框架是经历过上线产品的验证,框架简单明了,不熟悉底层封装的人,半个小时就能完全掌握服务器框架上手写业务逻辑。2、本课程是一个底层服务器框架教程,主要是教会学员在windows或linux下如何封装一个高效的,避免踩坑的商业级框架,服务器底层使用初始化即开辟内存的技术,使用内存池,服务器运行期间内存不会溢出,非常稳定,同时服务器使用自定义哈希hashContainer,在处理新的连接,新的数据,新的封包,以及解包,发包,粘包的过程,哈希容器性能非常高效,增、删、查、改永远不会随着连接人数的上升而降低性能,增、删、查、改的复杂度永远都是恒定的O(1)。3、服务器底层封装没有使用任何第三方网络库以及任何第三方插件,自由度非常的高,出了任何BUG,你都有办法去修改,查找问题也非常方便,在windows下使用iocp,linux下使用epoll.4、讲解c++纯客户端,主要用于服务器之间通信,也就是你想搭建多层结构的服务器,服务器与服务器之间使用socket通信。还可以使用c++客户端做压力测试,开辟多线程连接服务器,教程提供了压力测试,学员可以自己做压力测试服务器性能。5、赠送ue4和unity3d通信底层框架以及多人交互demo,登录,注册,玩家离开,同步主要是教会学员服务器与客户端如何交互。6、赠送c++连接mysql数据库框架demo,登录,注册,玩家离开数据持久化.7、服务器教程使用自定义通信协议,同时也支持protobuf,选择权在开发者自己手里,想用什么协议都可以,自由度高。8、服务器教程使用手动敲代码逐句讲解的方式开展教学课程。非喜勿喷,谢谢大家。9、服务器教程提供源码,大家可以在平台提供的地址下载或者联系我,服务器使用c++11部分标准,std::thread,条件变量,线程锁,智能指针等,需要学员具备一定c++知识,购买前慎重考虑。
Java聊天室程序 需求分析 2.1 业务需求 1. 与聊天室成员一起聊天。 2. 可以与聊天室成员私聊。 3. 可以改变聊天内容风格。 4. 用户注册(含头像)、登录。 5. 服务器监控聊天内容。 6. 服务器过滤非法内容。 7. 服务器发送通知。 8. 服务器踢人。 9. 保存服务器日志。 10.保存用户聊天信息。 2.2 系统功能模块 2.2.1 服务器端 1.处理用户注册 2.处理用户登录 3.处理用户发送信息 4.处理用户得到信息 5.处理用户退出 2.2.2 客户端 1.用户注册界面及结果 2.用户登录界面及结果 3.用户发送信息界面及结果 4.用户得到信息界面及结果 5.用户退出界面及结果 2.3 性能需求 运行环境:Windows 9x、2000、xp、2003,Linux 必要环境:JDK 1.5 以上 硬件环境:CPU 400MHz以上,内存64MB以上 3.1.2 客户端结构 ChatClient.java 为客户端程序启动类,负责客户端的启动和退出。 Login.java 为客户端程序登录界面,负责用户帐号信息的验证与反馈。 Register.java 为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。 ChatRoom.java 为客户端程序聊天室主界面,负责接收、发送聊天内容与服务器端的Connection.java 亲密合作。 Windowclose 为ChatRoom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。 Clock.java 为客户端程序的一个小程序,实现的一个石英钟功能。 3. 2 系统实现原理 当用户聊天时,将当前用户名、聊天对象、聊天内容、聊天语气和是否私聊进行封装,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端 当用户发送聊天信息时,服务端将会收到客户端Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问。 接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,在本程序中设定的是3秒刷新服务器一次,如果间隔时间太短将会增加客户端服务器端的通信负担,而间隔时间长就会让人感觉没有时效性,所以经过权衡后认为3秒最佳,因为每个用户都不可能在3秒内连续发送信息。 当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息人性化地显示在聊天信息界面上。 4.1.1 问题陈述 1.接受用户注册信息并保存在一个基于文件的对象型数据库。 2.能够允许注册过的用户登陆聊天界面并可以聊天。 3.能够接受私聊信息并发送给特定的用户。 4.服务器运行在自定义的端口上#1001。 5.服务器监控用户列表和用户聊天信息(私聊除外)。 6.服务器踢人,发送通知。 7.服务器保存日志。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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