分享
 
 
 

在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(二)----使用方法

王朝c#·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

一.TcpSvr的使用方法

A.测试程序:

using System;

using Ibms.Net.TcpCSFramework;

using System.Collections;

using System.Net.Sockets;

namespace Ibms.Test

{

/// <summary>

/// 测试TcpSvr的类

/// </summary>

public class TestTcpSvr

{

public TestTcpSvr()

{

}

public static void Main()

{

try

{

Console.WriteLine("Begin to Test TcpSvr class...");

TestTcpSvr tts = new TestTcpSvr();

//TcpSvr svr = new TcpSvr(9050,4);//默认使用Encoding.Default编码方式

TcpSvr svr = new TcpSvr(9050,4,new Coder(Coder.EncodingMothord.UTF8));

svr.Resovlver = new DatagramResolver("##");

//定义服务器的4个事件

//服务器满

svr.ServerFull += new NetEvent(tts.ServerFull);

//新客户端连接

svr.ClientConn += new NetEvent(tts.ClientConn);

//客户端关闭

svr.ClientClose += new NetEvent(tts.ClientClose);

//接收到数据

svr.RecvData += new NetEvent(tts.RecvData);

//命令控制循环

while(true)

{

Console.Write(">");

string cmd=Console.ReadLine();

//退出测试程序

if(cmd.ToLower() == "exit")

{

break;

}

//停止服务器程序

if(cmd.ToLower() == "stop")

{

svr.Stop();

Console.WriteLine("Server is Stop.");

continue;

}

//运行服务器程序

if(cmd.ToLower() == "start")

{

svr.Start();

Console.WriteLine("Server is listen...{0}",

svr.ServerSocket.LocalEndPoint.ToString());

continue;

}

//察看服务器在线客户端数目和容量

if(cmd.ToLower() == "count")

{

Console.WriteLine("Current count of Client is {0}/{1}",

svr.SessionCount,svr.Capacity);

continue;

}

//发送数据到客户端格式:send [Session] [stringData]

if(cmd.ToLower().IndexOf("send") !=-1)

{

cmd = cmd.ToLower();

string[] para = cmd.Split(' ');

if(para.Length ==3)

{

Session client = (Session)svr.SessionTable[ new SessionId( int.Parse

(para[1]))];

if(client !=null)

{

svr.Send(client, para[2]);

}

else

{

Console.WriteLine("The Session is Null");

}

}

else

{

Console.WriteLine("Error Command");

}

continue;

}

//从服务器上踢掉一个客户端

if(cmd.ToLower().IndexOf("kick") !=-1)

{

cmd = cmd.ToLower();

string[] para = cmd.Split(' ');

if(para.Length ==2)

{

Session client = (Session)svr.SessionTable[ new SessionId( int.Parse

(para[1]))];

if(client !=null)

{

svr.CloseSession(client);

}

else

{

Console.WriteLine("The Session is Null");

}

}

else

{

Console.WriteLine("Error command");

}

continue;

}

//列出服务器上所有的客户端信息

if(cmd.ToLower() == "list")

{

int i=0;

foreach( Session Client in svr.SessionTable.Values)

{

if(Client !=null)

{

i++;

string info = string.Format("{0} Client:{1} connected server Session:{2}. Socket Handle:{3}",

i,

Client.ClientSocket.RemoteEndPoint.ToString(),

Client.ID,

Client.ClientSocket.Handle);

Console.WriteLine( info );

}

else

{

i++;

string info = string.Format("{0} null Client", i);

Console.WriteLine(info);

}

}

continue;

}

Console.WriteLine("Unkown Command");

}//end of while

Console.WriteLine("End service");

}

catch(Exception ex)

{

Console.WriteLine(ex.ToString());

}

}

void ClientConn(object sender, NetEventArgs e)

{

string info = string.Format("A Client:{0} connect server Session:{1}. Socket Handle:{2}",

e.Client.ClientSocket.RemoteEndPoint.ToString(),

e.Client.ID,e.Client.ClientSocket.Handle);

Console.WriteLine( info );

Console.Write(">");

}

void ServerFull(object sender, NetEventArgs e)

{

string info = string.Format("Server is full.the Client:{0} is refused",

e.Client.ClientSocket.RemoteEndPoint.ToString());

//Must do it

//服务器满了,必须关闭新来的客户端连接

e.Client.Close();

Console.WriteLine(info);

Console.Write(">");

}

void ClientClose(object sender, NetEventArgs e)

{

string info ;

if( e.Client.TypeOfExit == Session.ExitType.ExceptionExit)

{

info= string.Format("A Client Session:{0} Exception Closed.",

e.Client.ID);

}

else

{

info= string.Format("A Client Session:{0} Normal Closed.",

e.Client.ID);

}

Console.WriteLine( info );

Console.Write(">");

}

void RecvData(object sender, NetEventArgs e)

{

string info = string.Format("recv data:{0} from:{1}.",e.Client.Datagram, e.Client);

Console.WriteLine( info );

TcpSvr svr = (TcpSvr) sender;

//测试把收到的数据返回给客户端

svr.Send(e.Client, e.Client.Datagram);

Console.Write(">");

}

}

}

B.说明:

使用命令来操作服务器

exit 退出

start 开始服务

kick 关闭客户端

send 发送数据

list 列出所有客户端的状态

count 客户端计数

先启动服务运行start,等待客户端连接。

然后可以使用list,count察看当前的连接状况

每个事件都有相应函数,客户就在事件处理函数中处理自己的业务逻辑

可以通过继承特化自己的服务器应用,基本的框架不变

二.TcpCli的使用方法

A.测试程序:

using System;

using Ibms.Net.TcpCSFramework;

namespace Ibms.Test

{

/// <summary>

/// TestTcpClient 的摘要说明。

/// </summary>

public class TestTcpClient

{

public TestTcpClient()

{

//

// TODO: 在此处添加构造函数逻辑

//

}

public static void Test()

{

Console.WriteLine("Begin to Test TcpCli Class..");

TestTcpClient test = new TestTcpClient();

TcpCli cli = new TcpCli( new Coder(Coder.EncodingMothord.UTF8));

cli.Resovlver = new DatagramResolver("##");

cli.ReceivedDatagram += new NetEvent(test.RecvData);

cli.DisConnectedServer += new NetEvent(test.ClientClose);

cli.ConnectedServer += new NetEvent(test.ClientConn);

try

{

//命令控制循环

while(true)

{

Console.Write(">");

string cmd=Console.ReadLine();

if(cmd.ToLower() == "exit")

{

break;

}

if(cmd.ToLower() == "close")

{

cli.Close();

continue;

}

if(cmd.ToLower().IndexOf("conn")!=-1)

{

cmd = cmd.ToLower();

string[] para = cmd.Split(' ');

if(para.Length ==3)

{

cli.Connect(para[1],int.Parse(para[2]));

}

else

{

Console.WriteLine("Error Command");

}

continue;

}

if(cmd.ToLower().IndexOf("send") !=-1)

{

cmd = cmd.ToLower();

string[] para = cmd.Split(' ');

if(para.Length ==2)

{

cli.Send(para[1]);

}

else

{

Console.WriteLine("Error Command");

}

continue;

}

Console.WriteLine("Unkown Command");

}//end of while

Console.WriteLine("End service");

}

catch(Exception ex)

{

Console.WriteLine(ex.ToString());

}

}

void ClientConn(object sender, NetEventArgs e)

{

string info = string.Format("A Client:{0} connect server :{1}",e.Client,

e.Client.ClientSocket.RemoteEndPoint.ToString());

Console.WriteLine( info );

Console.Write(">");

}

void ClientClose(object sender, NetEventArgs e)

{

string info ;

if( e.Client.TypeOfExit == Session.ExitType.ExceptionExit)

{

info= string.Format("A Client Session:{0} Exception Closed.",

e.Client.ID);

}

else

{

info= string.Format("A Client Session:{0} Normal Closed.",

e.Client.ID);

}

Console.WriteLine( info );

Console.Write(">");

}

void RecvData(object sender, NetEventArgs e)

{

string info = string.Format("recv data:{0} from:{1}.",e.Client.Datagram, e.Client);

Console.WriteLine( info );

Console.Write(">");

}

}

}

B.说明:

先建立连接,Conn 192.9.207.214 9050

然后可以Send 数据

最后关闭连接Close

三.编码器

如果你要加密你的报文,需要一个你自己的Coder

从Coder类继承一个如MyCoder类,然后重载编码和解码函数。

使用方法:

TcpCli cli = new TcpCli( new MyCoder());

就可以在客户端使用该编码器了。

四.报文解析器

与编码器同样的实现方法。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有