C# Socket的使用

C# 中的 System.Net.Sockets.Socket 类是 .NET Framework 提供的核心类,用于处理网络套接字编程。Socket 类是用于网络编程的基础类,它位于 System.Net.Sockets 命名空间中。

使用 Socket 类,可以创建客户端和服务器应用程序来进行基于TCP、UDP和其他网络协议的通信。

以下是如何在 C# 中使用 Socket 类进行基本的 TCP 服务器和客户端通信的步骤:

TCP 服务器端实现

服务端(Server)

  1. 创建监听套接字:服务端首先会创建一个ServerSocket对象(在Java中)或SOCKET类型的套接字(在C/C++中通常使用socket()函数创建),用于监听来自客户端的连接请求。

  2. 绑定地址和端口:服务端必须将其套接字与本地主机上的特定IP地址和端口号绑定,这通常是通过bind()函数实现。服务端通常选择固定的知名端口或注册端口,以便客户端能够知道在哪里建立连接。

  3. 监听连接请求:调用listen()函数使服务端进入监听状态,等待客户端的连接请求。

  4. 接受连接:当有客户端连接请求时,服务端通过accept()函数接收连接,这个函数会返回一个新的套接字,用于与该客户端进行通信。

 代码如下:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace SocketServer
{
    class Program
    {
        private static byte[] buffer = new byte[1024];
        private static int port = 8885; // 定义服务器监听端口

        static void Main(string[] args)
        {
            // 创建一个 IP 地址对象,绑定到本地主机
            IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
            
            // 创建一个新的 Socket 对象,指定为 IPv4、面向流(TCP)协议
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            
            // 绑定服务器 socket 到特定的 IP 和端口
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port);
            serverSocket.Bind(localEndPoint);

            // 开始监听连接请求,最大同时排队的连接数为 10
            serverSocket.Listen(10);
            Console.WriteLine($"启动监听 {serverSocket.LocalEndPoint} 成功");

            // 启动线程等待客户端连接
            Thread listenThread = new Thread(ListenForClients);
            listenThread.Start(serverSocket);
            
            // 等待控制台输入以保持程序运行
            Console.ReadLine();
        }

        private static void ListenForClients(object obj)
        {
            Socket listener = (Socket)obj;
            while (true)
            {
                // 接受一个客户端的连接请求
                Socket clientSocket = listener.Accept();

                // 发送欢迎消息给客户端
                string welcomeMessage = "ServerSayHello";
                byte[] data = Encoding.ASCII.GetBytes(welcomeMessage);
                clientSocket.Send(data);

                // 在单独的线程中处理来自客户端的消息
                Thread receiveThread = new Thread(ReceiveData);
                receiveThread.Start(clientSocket);
            }
        }

        private static void ReceiveData(object obj)
        {
            Socket clientSocket = (Socket)obj;
            while (true)
            {
                try
                {
                    // 接收客户端发来的数据
                    int received = clientSocket.Receive(buffer);
                    
                    // 将接收的数据转换为字符串并输出
                    string message = Encoding.ASCII.GetString(buffer, 0, received);
                    Console.WriteLine($"接收客户端 {clientSocket.RemoteEndPoint} 消息: {message}");
                    
                    // 实际应用中,这里可能需要对消息进行响应或进一步处理
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"接收异常:{ex.Message}");
                    // 关闭连接
                    clientSocket.Shutdown(SocketShutdown.Both);
                    clientSocket.Close();
                    break;
                }
            }
        }
    }
}

TCP 客户端实现

客户端(Client)

  1. 创建套接字:客户端也创建一个套接字,但它不是用来监听,而是用来发起连接请求。

  2. 指定服务端地址信息:客户端需要知道服务端的IP地址和端口号才能建立连接,它通过connect()函数尝试连接到服务端指定的地址和端口。

  3. 发送和接收数据:一旦连接成功建立,客户端可以通过套接字发送请求,并通过同一套接字接收服务端的响应。

代码如下: 

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace SocketClient
{
    class Program
    {
        private static byte[] buffer = new byte[1024];
        static void Main(string[] args)
        {
            // 设置要连接的服务器地址和端口
            IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
            int port = 8885;
            Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                // 连接到服务器
                clientSocket.Connect(new IPEndPoint(ipAddress, port));
                Console.WriteLine("连接服务器成功");

                // 接收服务器发送的消息
                int receiveLength = clientSocket.Receive(buffer);
                Console.WriteLine("接收服务器消息:{0}", Encoding.ASCII.GetString(buffer, 0, receiveLength));

                // 发送多条消息给服务器
                for (int i = 0; i < 10; i++)
                {
                    Thread.Sleep(1000); // 模拟延时
                    string sendMessage = $"ClientSendMessageHelp{i} at {DateTime.Now}";
                    byte[] data = Encoding.ASCII.GetBytes(sendMessage);
                    clientSocket.Send(data);
                    Console.WriteLine("向服务器发送消息:{0}", sendMessage);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("连接或通信过程中发生错误: {0}", ex.Message);
            }
            finally
            {
                // 关闭连接
                clientSocket.Shutdown(SocketShutdown.Both);
                clientSocket.Close();
                Console.WriteLine("发送完毕,按回车键退出...");
                Console.ReadLine();
            }
        }
    }
}

以上代码分别展示了如何创建一个简单的 TCP 服务器和客户端,服务器会监听客户端的连接请求,并在建立连接后与客户端交换数据。

客户端则尝试连接到服务器,并发送和接收数据。

请注意,使用Socket进行网络编程需要对网络协议和通信原理有一定的了解。

如果需要更复杂的网络通信功能,可能需要使用更高层次的网络库或框架,例如TcpClientTcpListener

Socket.Connected 不能作为TCP连接的判断依据

Socket.Connected 不能作为TCP连接的判断依据-CSDN博客

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangnaisheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值