c# 中转服务器,C# 客户端与服务器通信问题

本文介绍了如何使用C#进行TCP通信,包括客户端连接服务器、发送和接收消息的实现,以及服务器端的监听、接受客户端连接、发送消息和接收客户端消息的详细步骤。通过示例代码展示了异步回调方法在通信过程中的应用。
摘要由CSDN通过智能技术生成

C# 客户端与服务器通信问题

(2013-10-22 10:48:27)

标签:

csharp

开发

分类:

IT

客户端:

static void Main(string[] args)

{

//创建一个Socket

var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//连接到指定服务器的指定端口

socket.Connect("localhost", 4530);

Console.WriteLine("connect to the server");

//实现接受消息的方法

socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);

//接受用户输入,将消息发送给服务器端

while(true)

{

var message = "Message from client : " + Console.ReadLine();

var outputBuffer = Encoding.Unicode.GetBytes(message);

socket.BeginSend(outputBuffer, 0, outputBuffer.Length, SocketFlags.None, null, null);

}

}

static byte[] buffer = new byte[1024];

public static void ReceiveMessage(IAsyncResult ar)

{

try

{

var socket = ar.AsyncState as Socket;

var length = socket.EndReceive(ar);

//读取出来消息内容

var message = Encoding.Unicode.GetString(buffer, 0, length);

//显示消息

Console.WriteLine(message);

//接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)

socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);

}

catch(Exception ex)

{

Console.WriteLine(ex.Message);

}

}

服务器端:

static void Main(string[] args)

{

//创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)

var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//将该socket绑定到主机上面的某个端口

socket.Bind(new IPEndPoint(IPAddress.Any, 4530));

//启动监听,并且设置一个最大的队列长度

socket.Listen(4);

//开始接受客户端连接请求

socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);

Console.WriteLine("Server is ready!");

Console.Read();

}

public static void ClientAccepted(IAsyncResult ar)

{

var socket = ar.AsyncState as Socket;

//这就是客户端的Socket实例,我们后续可以将其保存起来

var client = socket.EndAccept(ar);

//给客户端发送一个欢迎消息

client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at " + DateTime.Now.ToString()));

//实现每隔两秒钟给服务器发一个消息

//这里我们使用了一个定时器

var timer = new System.Timers.Timer();

timer.Interval = 2000D;

timer.Enabled = true;

timer.Elapsed += (o, a) =>

{

//检测客户端Socket的状态

if(client.Connected)

{

try

{

client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));

}

catch(SocketException ex)

{

Console.WriteLine(ex.Message);

}

}

else

{

timer.Stop();

timer.Enabled = false;

Console.WriteLine("Client is disconnected, the timer is stop.");

}

};

timer.Start();

//接收客户端的消息(这个和在客户端实现的方式是一样的)

client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);

//准备接受下一个客户端请求

socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);

}

static byte[] buffer = new byte[1024];

public static void ReceiveMessage(IAsyncResult ar)

{

try

{

var socket = ar.AsyncState as Socket;

var length = socket.EndReceive(ar);

//读取出来消息内容

var message = Encoding.Unicode.GetString(buffer, 0, length);

//显示消息

Console.WriteLine(message);

//接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)

socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);

}

catch(Exception ex)

{

Console.WriteLine(ex.Message);

}

}

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

a4c26d1e5885305701be709a3d33442f.png

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值