日期:2014-05-16  浏览次数:21036 次

C# 两台电脑如何通过外网通信
因为初学C#,学到网络通信这就混乱了,还请大神赐教!
就是举个例子:比如,我的电脑 外网IP 是 116.246.2.227 ,我的 内网 IP 是 192.168.1.6 ,端口是:3200我想发送消息给  外网IP 是  220.120.123.42 内网 IP 是 192.168.0.2  端口为 3100 的电脑 ,如何顺利通信,这个通信的流程是怎样的,用C# 语言又该怎么变成实现?
可能我的例子有不恰当的地方,但是真心求赐教?
------解决方案--------------------
Socket、wcf、webservice都可以。
------解决方案--------------------
简单来说,你的两个电脑需要访问一台位于外网的服务器进行登录。它们登录时同时提交自己的内网地址。

然后内网的机器可以相互间首先使用对方的内网IP进行访问,使用服务器分配的授权号进行相互核对。如果可以对上授权号,那么就可以直接通讯;如果对不上,那么通过外网服务器转一下消息进行通讯。
------解决方案--------------------
如果是刚开始设计通讯方面程序,那么你使用服务器转发这一种形式也就够了。假设客户端跟服务器是长连接双工通讯的,那么你的通讯信令就应该可以区分是客户端到服务器还是从服务器到客户端的消息(例如使用id号>0和<0作为区分),服务器可以随时向客户端发送消息。当一个客户端发送消息给服务器,服务器判断这只是一个“路由消息”,于是它找到对方所在的Client通道,然后发送出去就行了,服务器处理这种动作不需要耗费基本毫秒的时间,也很快。
------解决方案--------------------
给楼主几个链接,看了 就很清晰明了了
http://www.cnblogs.com/JimmyZhang/archive/2008/09/07/1286300.html

------解决方案--------------------
你需要使用Socket打开一个链接的通道进行传输
------解决方案--------------------
要在路由做端口映射
------解决方案--------------------
随便去下载类似聊天软件的例子自己研究就行了
------解决方案--------------------
两个都在内网的主机需要通讯:

1.先打洞
2.如果做测试,可以在接收方的nat中做一个映射
  比如把接收方所在内网路由器上的一个公网端口 映射到 内网中的接收主机
  
 接收方公网IP  222.30.64.111  端口55555  设置映射  内网IP 192.168.1.100 内网端口 55556

那么你所有发送给 222.30.64.111:55555 的数据包  全部会转给  内网中 192.168.1.100:55556
至于发送方  不需要做处理  这个跟实际网络结构有关  不一定每次设置都会有效的
  

------解决方案--------------------
如果只是自己测试  建议使用第二种  第一种没有成熟的设计的话  根本不稳定   很容易失效
------解决方案--------------------
NAT打洞,适用于两端都是在内网的情况。因为第一次发送通讯请求,目标必须在公网上,所以通常来说,两端都在内网谁也无法发起连接,更不要说通讯了。

NAT打洞就是依赖一台服务器作为中转,让一个客户端和这个服务器通讯,另一个客户端通过实现和这个服务器建立的连接获得前一个客户端的端口、IP,然后服务器把控制权交给客户端,使得两个内网的客户端不再需要服务器中转就能直接通讯。
------解决方案--------------------
光有IP和端口还是不行的,你需要一种传输层的协议。通常来说有TCP和UDP两种协议。对于TCP协议,需要三次握手的过程,你结合教材自己先了解下。再在网上找例子程序看。
------解决方案--------------------
Socket