● 错误1 是按照题主的在问题里所描述的设计,网关服务器根本没有维持长连接的必要,只需要转发消息给业务服务器后跟 Client 的连接就可以断开了,剩下的都是业务服务器跟 Client 直接通信了。不知题主还有什么关于维持长连接的必要没有在问题里说明?
● 错误2 是如果维持长连接了,把 Client 的端口号转发给业务服务器了有什么用?Client 的这个端口正在跟网关服务器通信呢,业务服务器怎么可能通过这个端口跟 Client 建立连接?难道同一个端口还能被多个 Socket 占用吗?
● 建议 要么改为业务服务器不跟 Client 通信,还是经由网关服务器中转进行;要么业务服务器就需要跟 Client 进行“打洞”(Hole Punching)。
先说为什么要“打洞”。对于处在同一子网下的计算机还好说,假如 Client 在子网 A 下,且 A 下有多态接入设备(最常见的就是走路由了),那么 A 子网下的所有计算对于你的服务器来说 IP 都是一样的,所以你要想要穿过路由直接跟 A 子网下的某台计算机建立连接,就必须要先“打洞”。
再推荐几篇有关 C# 打洞(Hole Punching)的资料:
http://www.csharpwin.com/csharpspace/2249.shtml
http://www.cnblogs.com/OpenCoder/diary/2011/06/29/2093895.html
http://www.csframework.com/archive/2/arc-2-20110612-1557.htm
http://blog.csdn.net/yoeoo/article/details/3195403
http://www.csharpwin.com/csharpspace/2248.shtml
是这样的,多线程技术一般是应用在客户端-服务器的模型中,这个服务器是固定的,但是可以有多个客户端同时连接服务器(这里,多个客户端体现在IP或是源端口的不同),多线程就体现在服务器可以同时派发多个线程,去服务每个客户。你说的这种情况,用多线程来实现是可以的,只不过是同一个IP不同的源端口建立的socket而已,可以建立多个socket连接。给你个思路吧,当客户端连接到服务器时,你可以在服务器记录下每个客户端的信息,
最好自己写个Client类,属性Socket
,输入输出流,是否连接等。成员方法。
再写一个List来装Client的对象。
你要发送信息时,遍历一遍容器就行了,调用发送方法就行了。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)