当前位置:编程学习 > C#/ASP.NET >>

Socket外网连接

我想实现这个功能   CS的程序   一个客户端先往服务器发消息  然后服务器在给其他所有的客户端发消息   并且是外网发送  
现在客户端往服务器端发送消息成功   服务器给其他客户端发送不了    --------------------编程问答-------------------- 服务器维护一个客户端列表,循环发送就是了 --------------------编程问答-------------------- 我的这个不是循环发送  是即时的   比如A客户端给B服务器端发消息   B服务器收到后给CDEF......客户端发消息 --------------------编程问答-------------------- 问题就是服务器找不到客户端的IP地址    只能找到客户端外网路由器的IP地址  找不到客户端精确的IP --------------------编程问答-------------------- 你的意思是   服务端 在外网 一堆客户端在一个局域网内 用一个路由器上外网。 然后连接服务端,接着服务端回文,到了路由器,路由器不知道给谁了。

     客户端发过来的数据包头,加上自己的内网地址呗 --------------------编程问答-------------------- 服务端不可能一上来给外网客户端发消息。

客户端需要先访问服务端,服务端获取客户端socket信息之后在短时间内可以给他回复。时间长了恐怕就不行了。因为客户端多数是通过路由上网的,路由不可能一直记着下面哪台机器刚刚向外发包。

所以服务端要有一个客户端的维护列表,用于维持与客户端的连接。 --------------------编程问答-------------------- 做个监听的事件,把客户端登录的用户都放在一个列表中然后通过事件机制来操作,主要是当客户端发送消息到服务器时,触发一个事件,事件来异步循环发送消息到客户端这个不就是实现一个网络通讯吗! --------------------编程问答--------------------
引用 5 楼 wangyue4 的回复:
服务端不可能一上来给外网客户端发消息。

客户端需要先访问服务端,服务端获取客户端socket信息之后在短时间内可以给他回复。时间长了恐怕就不行了。因为客户端多数是通过路由上网的,路由不可能一直记着下面哪台机器刚刚向外发包。

所以服务端要有一个客户端的维护列表,用于维持与客户端的连接。
  服务没有一上来就给外网客户端发消息   客户端首先登录后  客户端会给服务器端发消息  然后服务器端会给客户端回个消息   服务器端在记录客户端用户的登录信息  什么时候登录  登录IP  登录用户等等信息     我现在要实现的是  客户端执行一个操作后  给服务器发消息  然后服务器在收到后再给其他客户端发消息  让其他客户端知道   --------------------编程问答-------------------- (IPEndPoint)lisSocket.RemoteEndPoint;
我用它获取客户端的IP但是现在有问题  只能获取到客户端路由器的IP   找不到具体是哪个客户端   --------------------编程问答--------------------
引用 8 楼 xinzailiulang 的回复:
(IPEndPoint)lisSocket.RemoteEndPoint;
我用它获取客户端的IP但是现在有问题 只能获取到客户端路由器的IP 找不到具体是哪个客户端

是的,所以说你的服务端要在短时间内回消息给客户端,路由器在短时间是可以记住的,这个类似打洞。
你的服务端要对所有客户端进行连接的维持才能实现“群发” --------------------编程问答--------------------
引用 3 楼 xinzailiulang 的回复:
问题就是服务器找不到客户端的IP地址 只能找到客户端外网路由器的IP地址 找不到客户端精确的IP


哪有什么“精确的IP”这一说?

比如说192.168.0.101,这个此时此刻有1000万个以上“客户端精确的IP”。1000万次重复混淆,难道它还被你看作精确IP么? --------------------编程问答-------------------- 这种东西暂时不给你说了。因为忽悠的很多,实际的东西很少。所以这种东西就算大多数路由器都支持的话,也要留着卖钱的。

引用 9 楼 wangyue4 的回复:
是的,所以说你的服务端要在短时间内回消息给客户端,路由器在短时间是可以记住的,这个类似打洞。
你的服务端要对所有客户端进行连接的维持才能实现“群发”


lz显然是在短时间内回消息的,它是服务器一得到路由器端节点地址和端口立刻就回消息,这个不用怀疑。 --------------------编程问答--------------------
引用楼主 xinzailiulang 的回复:
我想实现这个功能 CS的程序 一个客户端先往服务器发消息 然后服务器在给其他所有的客户端发消息 并且是外网发送  
现在客户端往服务器端发送消息成功 服务器给其他客户端发送不了


客户端跟服务器维持长连接,这样当服务器需要推送消息的时候,就可以随时发送了。

但是这要求你按照长连接的要求来设计软件,例如你应该考虑到客户端几十个请求并发地通过一次性的连接发给服务器,然后服务器并行处理请求之后再回复给客户端。也就是说在一条双工的tcp发起请求而建立的通道上,发送消息和返回消息不再是按照短连接的“一问一答”的方式来编程了(短连接通常通过并发多个请求来实现并发通讯)。

这就好比如说,只有一条电话线,现在有10个人分别要跟他们的10个亲人单独通话,那么你的客户端和服务通讯协议设计上就要考虑为每一个请求消息包装一个会话编号,然后服务器端返回结果时要附上当初请求时的会话编号,这样客户端就可以将返回消息与正在等待返回的请求消息匹配在一起,然后回调当初发出请求消息时注册的那个回调方法。

长连接方式可以穿越NAT,而且不用打洞。 --------------------编程问答-------------------- 路过,酱油,顶起。 --------------------编程问答-------------------- 如果其它的客户端和你的服务器是连接的,还可以实现。
否则,是发不了的。 --------------------编程问答-------------------- 也可以不需要长连接。可以通过第三方,比如数据库。当服务器收到某客户端的消息时,立马修改其他客户端在数据库中用来表示是否可以接收消息的这个字段,而其他客户端应不断地侦听自己的这个状态,若可以接收新消息,则向服务器发出连接。这时候服务器把消息发给连接他的客户端。 --------------------编程问答--------------------
引用 15 楼 xujinkun000 的回复:
也可以不需要长连接。可以通过第三方,比如数据库。当服务器收到某客户端的消息时,立马修改其他客户端在数据库中用来表示是否可以接收消息的这个字段,而其他客户端应不断地侦听自己的这个状态,若可以接收新消息,则向服务器发出连接。这时候服务器把消息发给连接他的客户端。


呵呵,搞办公室的OA开发的思路。这可以作为一个临时解决“方案”,用在几个人的小程序里。其实就算是高速局域网,你使用数据库读写来“通讯”的方式,那么也应该为每一个客户端单独创立一个数据库,这样才能实用(我有真实的上百万开发费的案例,但是那时早年用来忽悠人的,也有很多的经验教训,因为那个系统需要在1个月内上线,而我当时没有接触过socket方面的编程知识)。 --------------------编程问答--------------------
引用 15 楼 xujinkun000 的回复:
也可以不需要长连接。可以通过第三方,比如数据库。当服务器收到某客户端的消息时,立马修改其他客户端在数据库中用来表示是否可以接收消息的这个字段,而其他客户端应不断地侦听自己的这个状态,若可以接收新消息,则向服务器发出连接。这时候服务器把消息发给连接他的客户端。


这个最有用   不知道QQ等聊天工具是怎么做
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,