张德长

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

服务端的同步方式和异步方式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace EchoServer0328
{
public class ClientState
{
public Socket socket;
public byte[] readBuffer = new byte[1024];
}
internal class EchoServer
{
public const int port = 8888;
static Socket serverSocket;
static Dictionary<Socket, ClientState> clientDictionary = new Dictionary<Socket, ClientState>();
static void Main()
{
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(IPAddress.Any, port));
serverSocket.Listen(10);
Console.WriteLine("服务器启动成功");
serverSocket.BeginAccept(AcceptCallBack, serverSocket);
Console.Read();
}
private static void AcceptCallBack(IAsyncResult ar)
{
Socket listenSocket = ar.AsyncState as Socket;
Socket clientSocket = listenSocket.EndAccept(ar);
Console.WriteLine("新的客户端接入"+ clientSocket.RemoteEndPoint);
ClientState state = new ClientState();
state.socket = clientSocket;
clientDictionary.Add(clientSocket, state);
//开始接收
clientSocket.BeginReceive(state.readBuffer, 0, state.readBuffer.Length, 0, ReceiveCallBack, state);
//再次开始接受连接,循环接受
serverSocket.BeginAccept(AcceptCallBack, serverSocket);
}
/// <summary>
/// 接收回调
/// </summary>
/// <param name="ar"></param>
private static void ReceiveCallBack(IAsyncResult ar)
{
try
{
ClientState state = ar.AsyncState as ClientState;
Socket clientSocket = state.socket;
int length = clientSocket.EndReceive(ar);
if (length == 0)
{
clientSocket.Close();
clientDictionary.Remove(clientSocket);
Console.WriteLine("客户端关闭连接"+ clientSocket.RemoteEndPoint);
return;
}
string receiveString = Encoding.Default.GetString(state.readBuffer, 0, length);
receiveString = clientSocket.RemoteEndPoint +":"+ receiveString;
receiveString.Trim();
byte[] sendBuffer = Encoding.Default.GetBytes(receiveString);
//单发
//clientSocket.Send(sendBuffer);
//群发
foreach (var item in clientDictionary.Values)
{
item.socket.Send(sendBuffer);
}
//再次开始接收数据,循环接收
clientSocket.BeginReceive(state.readBuffer, 0, state.readBuffer.Length, 0, ReceiveCallBack, state);
}
catch (Exception ex)
{
Console.WriteLine("接收失败+" + ex.Message);
}
}
#region 同步服务器
//static void Main(string[] args)
//{
// Socket socketListen = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
// socketListen.Bind(new IPEndPoint(IPAddress.Any,8888));
// socketListen.Listen(0);
// Console.WriteLine("服务器启动成功");
// while (true)
// {
// Socket socketConnect = socketListen.Accept();
// Console.WriteLine("新客户端连接" );
// byte[] receiveBuffer = new byte[1024];
// int length = socketConnect.Receive(receiveBuffer);
// string receiveString = Encoding.Default.GetString(receiveBuffer,0,length);
// Console.WriteLine("收到数据:"+ receiveString);
// byte[] sendBuffer = Encoding.Default.GetBytes(receiveString);
// socketConnect.Send(sendBuffer);
// }
//}
#endregion
}
}

 

posted on   张德长  阅读(117)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示