当前位置:首页 > 行业动态 > 正文

c# socket网络编程接收发送数据示例代码

在C#中,使用Socket类进行网络编程可以接收和发送数据。以下是一个简单的示例代码:“ csharp,using System;,using System.Net;,using System.Net.Sockets;,using System.Text;class Program,{, static void Main(), {, // 创建Socket对象, Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 连接到服务器, client.Connect(IPAddress.Parse("127.0.0.1"), 8080); // 发送数据, string message = "Hello, Server!";, byte[] data = Encoding.ASCII.GetBytes(message);, client.Send(data); // 接收数据, byte[] buffer = new byte[1024];, int received = client.Receive(buffer);, string response = Encoding.ASCII.GetString(buffer, 0, received);, Console.WriteLine("Received: " + response); // 关闭连接, client.Shutdown(SocketShutdown.Both);, client.Close();, },},

服务器端代码

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class ServerProgram
{
    static void Main()
    {
        // 创建IPEndPoint对象,指定服务器的IP地址和端口号
        IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 5000);
        // 创建Socket对象
        Socket listener = new Socket(localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            // 将Socket绑定到指定的IPEndPoint
            listener.Bind(localEndPoint);
            // 开始监听传入的连接请求
            listener.Listen(10);
            Console.WriteLine("等待客户端连接...");
            while (true)
            {
                // 接受客户端的连接请求
                Socket handler = listener.Accept();
                string clientAddress = handler.RemoteEndPoint.ToString();
                Console.WriteLine("客户端 {0} 已连接", clientAddress);
                // 创建一个线程来处理客户端的请求
                Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                clientThread.Start(handler);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }
    public static void HandleClientComm(object obj)
    {
        Socket handler = (Socket)obj;
        byte[] buffer = new byte[1024];
        int bytesRead;
        // 接收客户端发送的数据
        while ((bytesRead = handler.Receive(buffer)) != 0)
        {
            string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead);
            Console.WriteLine("收到来自客户端的数据: {0}", dataReceived);
            // 将接收到的数据转换回字节数组并发送给客户端
            byte[] msg = Encoding.ASCII.GetBytes(dataReceived);
            handler.Send(msg, 0, msg.Length);
        }
        // 关闭与客户端的连接
        handler.Shutdown(SocketShutdown.Both);
        handler.Close();
    }
}

客户端代码

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class ClientProgram
{
    static void Main()
    {
        // 创建DnsEndPoint对象,指定服务器的主机名和端口号
        DnsEndPoint remoteEndPoint = new DnsEndPoint("localhost", 5000);
        // 创建Socket对象
        Socket sender = new Socket(remoteEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            // 连接到服务器
            sender.Connect(remoteEndPoint);
            Console.WriteLine("已连接到服务器");
            Console.WriteLine("请输入要发送的消息:");
            string message = Console.ReadLine();
            byte[] msg = Encoding.ASCII.GetBytes(message);
            // 向服务器发送数据
            int bytesSent = sender.Send(msg, 0, msg.Length);
            Console.WriteLine("发送了 {0} 字节", bytesSent);
            // 接收服务器返回的数据
            byte[] buffer = new byte[1024];
            int bytesRec = sender.Receive(buffer, 0, buffer.Length, SocketFlags.None);
            string receivedMessage = Encoding.ASCII.GetString(buffer, 0, bytesRec);
            Console.WriteLine("从服务器收到消息: {0}", receivedMessage);
            // 关闭与服务器的连接
            sender.Shutdown(SocketShutdown.Both);
            sender.Close();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }
}

在这个示例中,服务器端程序首先创建一个Socket对象,并将其绑定到指定的IP地址和端口号上,然后开始监听传入的连接请求,当有客户端连接到服务器时,服务器会为每个客户端创建一个新线程来处理其请求,在处理客户端请求的线程中,服务器接收客户端发送的数据,并将相同的数据返回给客户端,客户端程序则创建一个Socket对象,连接到服务器,然后向服务器发送一条消息,并接收服务器返回的消息,客户端关闭与服务器的连接。

需要注意的是,在实际的网络编程中,还需要考虑更多的异常处理和错误检查,以确保程序的稳定性和可靠性,还可以根据具体的需求对代码进行扩展和优化,例如添加多线程支持、使用异步编程模型等。

相关问答FAQs

问题1:如何确保服务器能够同时处理多个客户端的连接请求?

答:在这个示例中,服务器为每个连接的客户端创建了一个新的线程来处理其请求,这样,每个客户端都有自己独立的线程,可以同时处理多个客户端的连接请求,在实际应用中,如果客户端数量非常多,可能会因为线程过多而导致系统资源耗尽,可以考虑使用线程池或者异步编程模型来更有效地管理线程资源。

问题2:如何处理网络通信中的异常情况?

答:在网络通信中,可能会出现各种异常情况,例如网络中断、数据传输错误等,为了处理这些异常情况,可以在代码中添加适当的异常处理逻辑,可以使用try-catch块来捕获异常,并在捕获到异常时进行相应的处理,如记录日志、通知用户等,还可以在发送和接收数据时设置超时时间,以避免程序在某些情况下无限期地等待。

0