c#开发的游戏服务器,外网客户端怎么易语言连接外网服务器

随笔 - 74&
文章 - 0&评论 - 247&trackbacks - 0
在用C#开发Web应用时有个痛点,就是本机用VS开启Web应用调试时外部机器无法访问此Web应用。这里将会介绍如何通过设置允许局域网和外网机器访问本机的Web应用。
1. 设置内网访问
在设置之前,本机环境如下:
操作系统:win7
IDE:Visual Studio 2010
应用:ASP.net
想要实现局域网内其他机器访问本机web应用包含以下4步:
第一步:设置启动方式为IIS Express
Visual Studio 运行Web应用时,默认采用自身的Visual Studio开发服务器。所以先要把项目改为用 IIS Web服务器。
首先确保机器已经装了IIS Express,下载地址(10.0版本):
步骤:右键Web项目 & 属性 & Web选项卡 & 勾选使用本地IIS Web 服务器 & 设置端口并点击【创建虚拟目录】按钮
第二步:设置IIS Express的applicationhost.config文件
点击上面操作的【创建虚拟目录】按钮后,会在IIS Express的applicationhost.config文件创建虚拟目录信息。
文件默认路径:%userprofile%\My Documents\IISExpress\config\applicationhost.config
找到上面应用程序的配置信息,添加一条&binding&:
&binding protocol="http" bindingInformation="*:8081:*" /&
注意:修改前若已启动了IIS Express,修改后需要重新启动IIS Express才生效。
第三步:设置windows 防火墙
完成上面2步后,还需要设置防火墙允许此端口通过。
1) 图形操作:
打开 Windows 防火墙的高级设置:
① 控制面板 & Windows 防火墙 & 高级设置
② 创建一条入站规则:协议TCP、端口为8081。
也可以执行以下命令添加一条入站规则:
netsh advfirewall firewall Add rule name=\"命令行Web访问8081\" dir=in protocol=tcp localport=8081 action=allow
第四步:配置URL保留项
在Windows 7,可使用 Netsh.exe 工具配置HTTP设置,允许指定URL通过。
以管理员身份运行cmd命令:
netsh http add urlacl url=http://*:8081/ user=everyone
该命令为所有帐户的指定 URL 命名空间添加一个 URL 保留项
更多netsh资料,可访问相关MSDN:
2. 设置外网访问
设置好内网可访问后,想要外网的小伙伴访问本机,可通过以下2种方法:
1) 端口映射
2) 内网穿透
2.1 端口映射
前提条件:拥有路由器设置权限。
在对外的路由器中设置一条端口映射规则,访问外部IP地址时跳转到局域网机器上。具体操作这里不阐述。
2.2 内网穿透
在公司内开发web应用时,不是所有人都可以申请端口映射的权限,所以这时候就要有个内网穿透的解决方案了。
网络上提供内网穿透的应用有很多,这里使用的是花生壳(官网:)。
注意:微信OAuth2.0进行域名跳转时会加上端口号,此时域名端口为80,本机端口为8081,跳转后的地址为域名:8081会显示错误。解决方法只需要设置本机web应用的端口也为80即可。
==================================系列文章==========================================
本篇文章:1.5&C# Web应用调试开启外部访问
阅读(...) 评论()2017年2月 总版技术专家分月排行榜第三
2017年5月 .NET技术大版内专家分月排行榜第一2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
2015年3月 总版技术专家分月排行榜第二2014年12月 总版技术专家分月排行榜第二2014年9月 总版技术专家分月排行榜第二
2015年3月 .NET技术大版内专家分月排行榜第一2015年2月 .NET技术大版内专家分月排行榜第一2015年1月 .NET技术大版内专家分月排行榜第一2014年12月 .NET技术大版内专家分月排行榜第一2014年11月 .NET技术大版内专家分月排行榜第一
2015年3月 总版技术专家分月排行榜第二2014年12月 总版技术专家分月排行榜第二2014年9月 总版技术专家分月排行榜第二
2015年3月 .NET技术大版内专家分月排行榜第一2015年2月 .NET技术大版内专家分月排行榜第一2015年1月 .NET技术大版内专家分月排行榜第一2014年12月 .NET技术大版内专家分月排行榜第一2014年11月 .NET技术大版内专家分月排行榜第一
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。2607人阅读
学习一个新的东西,首先要知道其原理,对于Sockets的学习,可先看一下文档:http://blog.csdn.net/hulihui/article/details/3230503#st & &&
刚开始是写代码实现了一个客户端和服务器的通讯,后来完善代码,实现了多个客户端与服务器端的通讯,由于原理是差不多的,这里就直接介绍多个客户端与服务器进行通讯。
第一部分 &窗体设计
1.服务器端
第二部分 &代码
1.服务器端:
– 申请一个socket (socketWatch)用来监听的
– 绑定到一个IP地址和一个端口上
– 开启侦听,等待接授客户端的连接
– 当有连接时创建一个用于和连接进来的客户端进行通信的socket(socketConnection)
– 即续监听,等侍下一个客户的连接
//服务器端
using System.IO;
using System.N
using System.T
using System.Net.S
namespace SocketsServer
public partial class Form1 : Form
public Form1()
InitializeComponent();
Socket socketWatch =
Thread threadWatch =
private void startconn_Click(object sender, EventArgs e)
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipaddress = IPAddress.Parse(localip.Text.Trim());
IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(porttext.Text.Trim()));
socketWatch.Bind(endpoint);
socketWatch.Listen(10);
threadWatch = new Thread(WatchingConn);
threadWatch.IsBackground =
threadWatch.Start();
this.Invoke(new Action(() =&
recmsg.AppendText(&开始对客户端进行监听!& + &\r\n&);
//保存了服务器端所有负责和客户端通信发套接字
Dictionary&string, Socket& dictSocket = new Dictionary&string, Socket&();
//保存了服务器端所有负责调用通信套接字.Receive方法的线程
Dictionary&string, Thread& dictThread = new Dictionary&string, Thread&();
//Socket socConn =
private void WatchingConn(object obj)
while (true)
Socket socConn = socketWatch.Accept();
this.Invoke(new Action(() =& {
//向下拉项中添加一个客户端的ip端口字符串,作为客户端的唯一标识
iptext.Items.Add(socConn.RemoteEndPoint.ToString());
////将与客户端通信的套接字对象sokConn添加到键值对集合中,并以客户端IP端口作为键
dictSocket.Add(socConn.RemoteEndPoint.ToString(), socConn);
ParameterizedThreadStart pts = new ParameterizedThreadStart(RecMsg);
Thread trd = new Thread(pts);
trd.IsBackground =
trd.Start(socConn);
dictThread.Add(socConn.RemoteEndPoint.ToString(), trd);
this.Invoke(new Action(()=&
recmsg.AppendText(&客户端连接成功!& + &\r\n&);
private void RecMsg(object socketClientPara)
Socket socketRec = socketClientPara as S
while (true)
byte[] arrRecMsg = new byte[1024 * 1024];
//int length = socketClient.Receive(arrRecMsg);//......wrong......
int length = -1;
length = socketRec.Receive(arrRecMsg);
catch (SocketException ex)
MessageBox.Show(&异常:& + ex.Message);
//从通信套接字集合中删除被中断连接的通信套接字对象
dictSocket.Remove(socketRec.RemoteEndPoint.ToString());
//从通信线程结合中删除被终端连接的通信线程对象
dictThread.Remove(socketRec.RemoteEndPoint.ToString());
//从列表中移除被中断的连接 ip:Port
iptext.Items.Remove(socketRec.RemoteEndPoint.ToString());
catch (Exception ex)
MessageBox.Show(&异常:& + ex.Message);
string str = Encoding.UTF8.GetString(arrRecMsg, 0, length);
this.Invoke(new Action(() =& {
recmsg.AppendText(iptext.Text + &:\r\n& + GetTime() + &\r\n& + str + &\r\n&);
Thread.Sleep(10);
private DateTime GetTime()
DateTime getTime = new DateTime();
getTime = DateTime.N
return getT
private void SendMsg(string sendMsg)
if (string.IsNullOrEmpty(iptext.Text))
MessageBox.Show(&请选择通信IP!&);
byte[] strSendMsg = Encoding.UTF8.GetBytes(sendMsg);
string strClientKey = iptext.T//通过Key匹配对应ip地址的客户端
dictSocket[strClientKey].Send(strSendMsg);
this.Invoke(new Action(() =&
recmsg.AppendText(&服务器:& + &\r\n& + GetTime() + &\r\n& + sendMsg + &\r\n&);
sendmsg.Text =
private void sendok_Click(object sender, EventArgs e)
SendMsg(sendmsg.Text.Trim());
2.客户端:
– 申请一个socket
– 连接服务器(指明IP地址和端口号)
using System.IO;
using System.N
using System.Net.S
using System.T
namespace SocketsClient
public partial class Form1 : Form
public Form1()
InitializeComponent();
Socket socketWatch =
Thread threadWatch =
private void startconn_Click(object sender, EventArgs e)
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress address = IPAddress.Parse(iptext.Text.Trim());
IPEndPoint endpoint = new IPEndPoint(address, int.Parse(porttext.Text.Trim()));
socketWatch.Connect(endpoint);
// socketWatch.Bind(endpoint);//...报错(服务器是Bind,客户端是Connect)...
threadWatch = new Thread(RecMsg);
threadWatch.IsBackground =
threadWatch.Start();
private void RecMsg(object obj)
while (true)
byte[] arrRecMsg = new byte[1024 * 1024];
int length = socketWatch.Receive(arrRecMsg);
string str = Encoding.UTF8.GetString(arrRecMsg, 0, length);
this.Invoke(new Action(() =& {
recmsg.AppendText(&服务器:& + &\r\n& + GetTime() + &\r\n& + str + &\r\n&);
private DateTime GetTime()
DateTime getTime = new DateTime();
getTime = DateTime.N
return getT
private void SendMsg(string sendMsg)
byte[] strSenMsg = Encoding.UTF8.GetBytes(sendMsg);
socketWatch.Send(strSenMsg);
this.Invoke(new Action(() =&
recmsg.AppendText(&客户端:& + &\r\n& + GetTime() + &\r\n& + sendMsg + &\r\n&);
sendmsg.Text =
private void sendok_Click(object sender, EventArgs e)
SendMsg(sendmsg.Text.Trim());
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:25788次
排名:千里之外
转载:15篇
(1)(2)(4)(3)(2)(9)C# socket游戏编程(1服务器,多客户端)
资料价格:1学豆&&[]&&
文件类型: (doc)[]
文件大小:125.0 KB
上传时间:
标&&&&&&&签: & & & & & & & & & & &
论文写作技巧
C# socket游戏编程(1服务器,多客户端)
您可能需要的
[] [] [] [] [] [] [] []

我要回帖

更多关于 易语言连接外网服务器 的文章

 

随机推荐