C# 控制台程序 Socket 简单使用

参考

环境

软件/系统 版本 说明
Windows windows 10 专业版 22H2 64 位操作系统, 基于 x64 的处理器
git命令行工具 2.47.1.windows.1
Visual Studio Code 1.100.2
.NET Framework 9.0

代码

Socket 没有提供如监听断开连接等事件方法。

  1. SERVER
    using System.Collections.Concurrent;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    
    IPAddress iP = IPAddress.Parse("127.0.0.1");
    IPEndPoint ipEndPoint = new IPEndPoint(iP, 2300);
    
    using Socket listener = new(
    	ipEndPoint.AddressFamily,
    	SocketType.Stream,
    	ProtocolType.Tcp);
    
    listener.Bind(ipEndPoint);
    listener.Listen(100);
    
    // 客户端列表
    ConcurrentBag<Socket> clients = new();
    //
    while (true)
    {
    	var client = listener.Accept();
    	clients.Add(client);
    	Console.WriteLine("Socket server accepted client.");
    	Thread thread = new(() =>
    	{
    		while (true)
    		{
    			try
    			{
    				// 接受消息
    				var buffer = new byte[1024];
    				var received = client.Receive(buffer, SocketFlags.None);
    				var response = Encoding.UTF8.GetString(buffer, 0, received);
    				Console.WriteLine(response);
    				// 循环发送给 其他客户端
    				foreach (var i in clients)
    				{
    					// 排除自己
    					if (i == client)
    					{
    						continue;
    					}
    					// 发送消息
    					buffer = Encoding.UTF8.GetBytes(response);
    					i.Send(buffer, SocketFlags.None);
    				}
    			}
    			catch (Exception e)
    			{
    				// 移除指定客户端(如果不移除,下次连接时会导致发送一条消息后就自动下线)
    				clients.TryTake(out Socket? client);
    				// 打印异常信息
    				Console.WriteLine(e.StackTrace);
    				// 接触线程
    				break;
    			}
    		}
    
    	});
    	thread.Start();
    }
    
    
  2. CLIENT
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    
    IPAddress iP = IPAddress.Parse("127.0.0.1");
    IPEndPoint ipEndPoint = new IPEndPoint(iP, 2300);
    
    using Socket client = new(
    	ipEndPoint.AddressFamily,
    	SocketType.Stream,
    	ProtocolType.Tcp);
    
    client.Connect(ipEndPoint);
    //
    // 监听服务端的消息
    Thread thread = new(() =>
    {
    	while (true)
    	{
    		try
    		{
    			// 接受消息
    			var buffer = new byte[1024];
    			var received = client.Receive(buffer, SocketFlags.None);
    			var response = Encoding.UTF8.GetString(buffer, 0, received);
    			Console.WriteLine(response);
    		}
    		catch (Exception e)
    		{
    			Console.WriteLine(e.Message);
    			break;
    		}
    	}
    });
    thread.Start();
    // 客户端发送消息
    while (true)
    {
    	var message = Console.ReadLine();
    	if (message == null)
    	{
    		continue;
    	}
    	// Console.WriteLine(message);
    	var messageBytes = Encoding.UTF8.GetBytes(message);
    	var code = client.Send(messageBytes, SocketFlags.None);
    	Console.WriteLine("code: "+code);
    }
    
    // client.Shutdown(SocketShutdown.Both);
    
posted @ 2025-06-03 23:53  夏秋初  阅读(24)  评论(0)    收藏  举报