本人刚学网络编程,写了一个简单的聊天工具,分服务端和多个客户端。由于我用的是锐捷校园网,当客户端在外网试图连接时遇到了难题。
众所周知,局域网对外用的是公用IP地址,外网进来时分不清要连接的主机的地址,地址需要转换才能直接通讯。因此,要解决的问题是如何将内网的地址暴露到外网,让外网能够连接上。经过度娘的多次指导,了解到用端口映射可以解决问题。至于端口映射原理,可以去问度娘。
由于校园网是经过层层转发出去的,而且学生没有路由等相关权限,因此,一个较为简单的方法就是借助相关工具。在这里,介绍一个好用的工具,花生壳。下面是使用教程(面向的是小白,高手勿喷)。
首先是登陆花生壳网站http://www.oray.com/
点击下载
选择好适合自己的版本,,我选择的是6.5工程版。然后安装,安装好后点击注册,然后按要求注册账号,(身份证可百度一个哈),注册好登陆,发现已分配一个免费的域名给你,然后在域名上右键->花生壳管理->开启花生壳映射,添加映射。
应用名称填自己编写的服务端执行文件的名字,我的是SocketServer,内网ip填自己的校园网的静态ip,内网端口填服务端执行时使用的端口,我用的是8889,然后点击确定。
等待十几秒后,就映射成功
可以看出,外网访问服务端时应当使用端口40113。至此,网络设置已弄好(保持花生壳的运行),剩下的就是编程了。
一般情况下客户端的socket代码是这样的:
IPAddress ip = IPAddress.Parse("172.142.0.1");//服务端的IP
Socket clientSocket=new Socket (AddressFamily .InterNetwork,SocketType.Stream,ProtocolType.Tcp);
try
{
clientSocket.Connect(new IPEndPoint(ip, 8889)); / /服务端口
}。。。。。。。。。。。。
但这样外网是连不上的,于是改成映射ip和端口,代码如下:
string strIP = Dns.GetHostEntry("*******.eicp.net").AddressList[0].ToString(); // 括号里面的就是刚才申请的域名神马的,即上图显示的外网访问地址,不带后面的 :端口号
IPAddress ip = IPAddress.Parse(strIP);
try
{
clientSocket.Connect(new IPEndPoint(ip, 40113)); //将8889端口改为40113 注:服务端那边的端口设置依然是8889
这样客户端设置后,外网的客户端就可以连接到校园网内的服务端了。
OVER