本篇写的是利用C# TCP的异步方式实现服务器处理多个客户端的连接,以及使用异步的方式实现客户端和服务端的收发消息。
实现服务器处理多个客户端连接以及两端收发消息有多线程和异步实现两种方式,多线程的实现不在本篇的实现范围内,本篇只给出C#异步的实现代码。
相关代码如下:
Server端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
namespace TCPServer
{
class Program
{
static void Main(string[] args)
{
StartServerASync();
Console.ReadKey();
}
static void StartServerASync()
{
string ipStr = "127.0.0.1";
int port = 888;
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress iPAddress = IPAddress.Parse(ipStr);
IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, port);
serverSocket.Bind(iPEndPoint);
serverSocket.Listen(0); // 0-表示处理连接数不受限制
//Socket clientSocket = serverSocket.Accept(); // 接受一个客户端连接
serverSocket.BeginAccept(AcceptCallBackAsync, serverSocket);
}
static void AcceptCallBackAsync(IAsyncResult ar)
{
Socket serverSocket = ar.AsyncState as Socket;
Socket clientSocket = serverSocket.EndAccept(ar);
/// 向客户端发送一条消息
string msg = "你好,Client!";
byte[] data = Encoding.UTF8.GetBytes(msg);
clientSocket.Send(data);
clientSocket.BeginReceive(dataBuffer, 0, buffSize, SocketFlags.None, ReceiveCallBack, clientSocket);
// 继续处理下一个客户端连接
serverSocket.BeginAccept(AcceptCallBackAsync, serverSocket);
}
static int buffSize = 1024;
static byte[] dataBuffer = new byte[buffSize];
static void ReceiveCallBack(IAsyncResult ar)
{
Socket clientSocket = null;
try
{
clientSocket = ar.AsyncState as Socket;
int count = clientSocket.EndReceive(ar);
if (count == 0)
{
clientSocket.Close();
Console.WriteLine("客户端主动关闭连接");
return;
}
string msg = Encoding.UTF8.GetString(dataBuffer, 0, count);
Console.WriteLine("从客户端接收到数据:" + count + ":" + msg);
// 继续接受消息
clientSocket.BeginReceive(dataBuffer, 0, buffSize, SocketFlags.None, ReceiveCallBack, clientSocket);
}
catch (Exception e)
{
Console.WriteLine(e);
if (clientSocket != null)
{
clientSocket.Close();
}
}
}
}
}
Client端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace TCPClient
{
class Program
{
static void Main(string[] args)
{
string serverIPStr = "127.0.0.1";
int port = 888;
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(new IPEndPoint(IPAddress.Parse(serverIPStr), port));
// 接收服务器消息
byte[] data = new byte[1024];
int count = clientSocket.Receive(data);
string msg = Encoding.UTF8.GetString(data, 0, count);
Console.WriteLine(msg);
while (true)
{
string sendMsg = Console.ReadLine();
if(sendMsg=="Close Client")
{
clientSocket.Close();
return;
}
byte[] sendData = Encoding.UTF8.GetBytes(sendMsg);
clientSocket.Send(sendData);
}
Console.ReadKey();
clientSocket.Close();
}
}
}
运行结果截图: