- 浏览: 12263 次
最新评论
【转】flex与c#基于socket的实时互动网络游戏编程教程一-零纪录-博客园
2011年07月14日
网易博客安全提醒:系统检测到您当前密码的安全性较低,为了您的账号安全,建议您适时修改密码 立即修改 | 关闭
【转】flex与c#基于socket的实时互动网络游戏编程教程一-零纪录-博客园
2011-07-14 02:03:09| 分类: 默认分类| 标签:|字号大中小 订阅 近些年webGame非常火爆,可惜相关教程实在少之又少,在我学习过程中无数次baidu,google。发现实际涉及wenGame核心的东西基本没有。于是就有了把我学习过程中使用和总结的代码拿上来给大家分享,让有共同爱好的同学们少走弯路。
本教程基于flex与c#,做到完全同步的游戏设计与编写。本教程只提供实现基本功能的代码,只要融会贯通,就能在此基础上制作出无比强大的网络游戏。
这篇教程最好是对c#有一定基础,会使用vs的同学。假如不会,我推荐看一下《c#网络应用编程》。
本教如需转载,请注名作者--汪舰,联系方式sxnrt#126。
先来段c#下基由socket连接的代码,什么不是讲flex?flex连接服务器端也是用c#写的(实在也可以用c++或者java写,不过原理都是一样,一通百通)
说明,c#封装了socket,提供操纵更方便的Tcpclient与TcpListener,c#属于
服务器端
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
namespace TestOnlyServer
{
public partial class Form1 : Form
{
public Form1 )
{
InitializeComponent );
}
/// 使用的本机IP地址
IPAddress localAddress;
/// 监听端口
private const int port = ;
private TcpListener myListener;
public BinaryReader br;//读取连接用户发来的数据
private BinaryWriter bw;//给连接用户发送数据
private void Form1_Load object sender, EventArgs e)
{
// IPAddress[] addrIP = Dns.GetHostAddresses Dns.GetHostName ));
// localAddress = addrIP[0];
localAddress = IPAddress.Parse "192.168.1.100");//换本钱机ip
}
private void button1_Click object sender, EventArgs e)
{//在设计面版加一个按钮并添加一个事件
myListener = new TcpListener localAddress, port); //检听端口设置
myListener.Start );//开始检听端口
textBox1.Text = string.Format "开始在{0}:{1}监听客户连接", localAddress, port);
//创建一个线程监听客户端连接请求
Thread myThread = new Thread ListenClientConnect);
myThread.Start );//开始线程,实在线程的概念很好理解,就是执行一个函数,不过这个函数只和其他函数是并发的,并且占用的服务器资源比较小,由于只用了一部分计算资源
}
/// 接收客户端连接
///
private void ListenClientConnect ) { TcpClient newClient = null; while true) { try { newClient = myListener.AcceptTcpClient );//当有客户连接时执行一次下面的步骤
}
catch
{
//当单击"停止监听"或者退出此窗体时AcceptTcpClient )会产生异常
//因此可以利用此异常退出循环
break;
}
//每接受一个客户端连接,就创建一个对应的线程循环接收该客户端发来的信息
Thread threadReceive = new Thread ReceiveData);
threadReceive.Start newClient);
textShow string.Format "[{0}]进进", newClient.Client.RemoteEndPoint));
//由于textBox1不是由本线程创建的,所以要在线程中操纵textBox1必须使用一个动态引用
}
}
//现成援引From控件
delegate void SetTextCallback string text);
private void textShow string str)
{
if textBox1.InvokeRequired)
{
SetTextCallback d = textShow;
textBox1.Invoke d,str);
}
else
{
this.textBox1.Text = "/n" + textBox1.Text + str;
}
}
///
/// 处理接收的客户端数据
///
/// 客户端信息
private void ReceiveData object userState)
{
TcpClient client = TcpClient)userState;
NetworkStream networkStream = client.GetStream );
//将网络流作为二进制读写对象
br = new BinaryReader networkStream);
bw = new BinaryWriter networkStream);
while true)
{
string receiveString = null;
try
{
//从网络流中读出字符串网页游戏排行榜2011前十名:http://www.youxilin.com/,网络游戏排行榜2011前十名此方法会自动判定字符串长度前缀,并根据长度前缀读出字符串
textShow string.Format "测试数据1"));
receiveString = br.ReadString ); textShow string.Format "测试数据2"));
}
catch
{
break;
}
textShow string.Format "[{0}]哈哈哈", receiveString));
//猜测,假如想给所有客用端发信息,在开始时应该把客用端保存在一个array里,然后这里用循环发送
bw.Write "oyoy");
bw.Flush );
}
}
}
}
客用端
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.IO;
using System.Net;
using System.Threading;
namespace TestOnlyClient
{
public partial class Form1 : Form
{
public Form1 )
{
InitializeComponent );
}
private TcpClient client;
private BinaryReader br;
private BinaryWriter bw;
private void Form1_Load object sender, EventArgs e)
{
}
private void button1_Click object sender, EventArgs e)
{
client = new TcpClient Dns.GetHostName ), );
textBox1.Text = "连接咯";
Thread threadReceive = new Thread new ThreadStart ReceiveData));
threadReceive.Start ); } private void button2_Click object sender, EventArgs e) { try { NetworkStream networkStream = client.GetStream ); bw = new BinaryWriter networkStream); bw.Write "gogogo"); bw.Flush ); } catch { } } private void ReceiveData ) { NetworkStream networkStream = client.GetStream ); //将网络流作为二进制读写对象
br = new BinaryReader networkStream);
string receiveString = null;
receiveString = br.ReadString );
MessageBox.Show receiveString);
}
}
}
Ok,用vs分别打开2个工程,把ip换成自己本机的ip,你要不知道怎么看本机ip,那我也没啥好说的,呵呵。
这样就创建了纯c#的程序通讯。下一节开始讲如何使用flex与c#做最基本的基于socket的通讯。
Tony Ventrice谈社交游戏设计的三大目标
TTX1基板泄露游戏之KOF 98 Ultimate Match 拳皇98终极挑战)
《从网络到现实》
【网络游戏】QQ三国简介
游戏开发小组对网游的十条研发建议
如何做好网络促销?
我想设计一个游戏,可是不会弄游戏软件,手弄到辣椒怎么办?
中国游戏产业因互联网而重生 转载)
【转】 黑塔利亚资源集合! 角色歌+DVD+OST+DRAMA+漫画+网络广播剧+本家游戏)
续上 -----------一个网络游戏 毁了我一生,第二部』
发表评论
-
javascript 光标离开 判断数字的正则表达式
2012-07-06 09:46 1129Javascript 判断数字 在文本框上绑定事件,当焦点 ... -
iframe使用
2012-07-06 09:30 741i am now in university(HIT@We ... -
javascript 父子窗口传值示例代码
2012-07-05 20:45 826javascript showModalDialog传值与 ... -
Flash与组件:CircleSlider
2012-07-03 13:44 650今晚是2010年最后一天,要跟随地球重新开始新的一年。一直 ... -
[RemoteClass(alias="flex.samples.product.Product")]、前台和后台的数据更新举例
2012-07-02 12:48 612【问题描述】 点击左侧的表格,数据的信息将在右侧显示 ... -
Flex 监听键盘事件
2012-07-02 12:48 745一、说明 1、只有当监听的对象获取焦点后,才能出接收 ... -
Cross-domain policy和/WEB-INF/flex/proxy-config.xml
2012-07-02 12:48 583从flash 7开始,不同域名的资源访问受到限制,比如a. ... -
flex读取.xml文件
2012-07-02 12:48 5611。这是mxml代码: ... -
Flex中DataGrid动态增加列
2012-07-02 12:47 474方法一: ... -
让数据自己来讲故事
2012-07-01 10:12 519Adobe Flash Builder 4 简 ... -
AntPile简介
2012-07-01 10:12 541Adobe Flash Builder 4 简体中文正式版 ... -
AntPile简介
2012-07-01 10:12 577Adobe Flash Builder 4 简体中文正式版 ... -
使用Flare3D在FB中搭建第一个Molehill项目
2012-07-01 10:12 565本文介绍如何使用第三方开发框架Flare 3D 2.0在F ... -
一个智能的 Web 界面测试系统
2012-07-01 10:12 664本文内容包括: Web2.0 技术使 Web 界面更加丰富 ... -
[转载]Google采用FLEX构建虚拟社区Lively
2012-06-30 16:37 592[转载]Google采用FLEX构建 ... -
Flex引擎
2012-06-30 16:37 853Flex引擎 2010年06月04日 游戏引擎 1 ... -
[转]在Flex Builder 3的ActionScript工程里面使用Flash的Tween类
2012-06-30 16:37 656[转]在Flex Builder 3的ActionScript ...
相关推荐
【转】c# xml添加 删除 修改数据 - badnewfish - 博客园.htm【转】c# xml添加 删除 修改数据 - badnewfish - 博客园.htm【转】c# xml添加 删除 修改数据 - badnewfish - 博客园.htm【转】c# xml添加 删除 修改数据 -...
C# 绘制统计图(柱状图, 折线图, 扇形图) - steven_2005 - 博客园
SanNiuSignal是一个基于异步socket的完全免费DLL;它里面封装了Client,Server以及UDP;有了这个DLL;用户不用去关心心跳;粘包 ;组包;发送文件等繁琐的事情;大家只要简单的几步就能实现强大的通信系统;能帮助到...
C#编程总结(九)字符编码 - 停留的风 - 博客园.mhtml
开源的搜索引擎工具包和web搜索引擎系统 - austin lius fashion - 博客园.docx开源的搜索引擎工具包和web搜索引擎系统 - austin lius fashion - 博客园.docx开源的搜索引擎工具包和web搜索引擎系统 - austin lius ...
开源的搜索引擎工具包和web搜索引擎系统 - austin lius fashion - 博客园.pdf开源的搜索引擎工具包和web搜索引擎系统 - austin lius fashion - 博客园.pdf开源的搜索引擎工具包和web搜索引擎系统 - austin lius ...
推荐--jQuery使用手册 - 仰天一笑 - 博客园
1. Re:C#委托+回调详解 3. ESP8266刷AT固件与node 1.用户可以使用杜邦线根据自己的情况设置和连接引脚 4. 用ESP8266+andro
我总结的Android编程规范 - 薰衣草的旋律 - 博客园1
ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园
这是我从博客园众多博客发表的文章精心整理而来的,牵涉到C#的方方面面,拾遗补缺,相信对大家大有裨益。首先谢谢这些博客,每篇文章我都注明了博客名和出处。
Java并发编程:线程池的使用 - 平凡希 - 博客园平凡希博客园首页联系管理随笔 - 127 文章 - 1 评论 - 94Java并发编程:线程池的使用在前面
转ibatis动态sql - phoebus0501 - 博客园.mht
图解]ARP协议(一) - 博客园.pdf
C# 基于MQTTNet的服务端与客户端通信案例
Spring.NET学习笔记 - 刘冬.NET - 博客园
这是我从博客园众多博客发表的文章精心整理而来的,牵涉到C#的方方面面,拾遗补缺,相信对大家大有裨益。首先谢谢这些博客,每篇文章我都注明了博客名和出处。
这是我从博客园众多博客发表的文章精心整理而来的,牵涉到C#的方方面面,拾遗补缺,相信对大家大有裨益。首先谢谢这些博客,每篇文章我都注明了博客名和出处。
C#常用命名空间 ,C#常用命名空间 -,C#常用命名空间 -
关于Makefile的编写,参考的说的比较详细的一篇博客,将网页下载下来的,供离线参考