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

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();, },},

一、服务器端代码

1、引用命名空间

using System;

using System.Net;

using System.Net.Sockets;

using System.Text;

using System.Threading;

2、创建服务器端类

创建一个名为Server的类,包含主方法Main以及用于启动服务器、接受客户端连接和接收数据的方法。

3、启动服务器

Main方法中,创建一个TcpListener对象,指定监听的IP地址和端口号,监听本地主机的8000端口。

调用TcpListenerStart方法开始监听。

使用Console.WriteLine输出服务器已启动的信息。

4、接受客户端连接

在一个循环中,调用TcpListenerAcceptTcpClient方法等待客户端连接,该方法会阻塞线程,直到有客户端连接。

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

当有客户端连接时,创建一个新的线程来处理该客户端的请求,以便服务器可以同时处理多个客户端,在线程中,获取与客户端通信的NetworkStream对象。

5、接收数据

NetworkStream中读取数据,可以使用StreamReader来方便地读取字符串数据。

将接收到的数据输出到控制台。

6、发送数据

使用StreamWriter向客户端发送数据,发送一个确认消息给客户端。

7、关闭连接

处理完客户端请求后,关闭NetworkStreamTcpClient对象,释放资源。

二、客户端代码

1、引用命名空间

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

与服务器端相同的命名空间。

2、创建客户端类

创建一个名为Client的类,包含主方法Main以及用于连接到服务器、发送数据和接收数据的方法。

3、连接到服务器

Main方法中,创建一个TcpClient对象,指定服务器的IP地址和端口号,连接到本地主机的8000端口。

调用TcpClientConnect方法建立与服务器的连接。

4、发送数据

获取与服务器通信的NetworkStream对象。

使用StreamWriter向服务器发送数据,发送一条消息给服务器。

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

5、接收数据

使用StreamReader从服务器接收数据。

将接收到的数据输出到控制台。

6、关闭连接

处理完与服务器的交互后,关闭NetworkStreamTcpClient对象,释放资源。

三、完整示例代码

(一) 服务器端代码

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
class Server
{
    static void Main(string[] args)
    {
        TcpListener listener = null;
        try
        {
            // 设置IP地址和端口号
            IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
            int port = 8000;
            // 创建TCP监听器
            listener = new TcpListener(ipAddress, port);
            listener.Start();
            Console.WriteLine("服务器已启动,等待客户端连接...");
            while (true)
            {
                // 接受客户端连接
                TcpClient client = listener.AcceptTcpClient();
                Console.WriteLine("客户端已连接");
                // 创建线程处理客户端请求
                Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                clientThread.Start(client);
            }
        }
        catch (SocketException se)
        {
            Console.WriteLine("SocketException: {0}", se);
        }
        finally
        {
            if (listener != null)
            {
                listener.Stop();
            }
            Console.WriteLine("服务器已停止");
        }
    }
    public static void HandleClientComm(object client)
    {
        TcpClient tcpClient = (TcpClient)client;
        NetworkStream clientStream = tcpClient.GetStream();
        // 接收数据
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = clientStream.Read(buffer)) != 0)
        {
            string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine("收到来自客户端的数据: " + receivedData);
            // 发送数据
            string response = "数据已接收";
            byte[] dataToSend = Encoding.UTF8.GetBytes(response);
            clientStream.Write(dataToSend, 0, dataToSend.Length);
        }
        // 关闭连接
        clientStream.Close();
        tcpClient.Close();
    }
}

(二) 客户端代码

using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;
class Client
{
    static void Main(string[] args)
    {
        TcpClient client = null;
        try
        {
            // 设置服务器的IP地址和端口号
            IPAddress serverIp = IPAddress.Parse("127.0.0.1");
            int serverPort = 8000;
            client = new TcpClient(serverIp, serverPort);
            Console.WriteLine("已连接到服务器");
            // 发送数据
            NetworkStream stream = client.GetStream();
            string message = "你好,服务器!";
            byte[] dataToSend = Encoding.UTF8.GetBytes(message);
            stream.Write(dataToSend, 0, dataToSend.Length);
            Console.WriteLine("已发送数据: " + message);
            // 接收数据
            byte[] buffer = new byte[1024];
            int bytesRead = stream.Read(buffer);
            string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine("收到来自服务器的响应: " + receivedData);
        }
        catch (SocketException se)
        {
            Console.WriteLine("SocketException: {0}", se);
        }
        finally
        {
            if (client != null)
            {
                client.Close();
            }
        }
    }
}

四、FAQs

1、如何确保服务器能够同时处理多个客户端连接?

在服务器端代码中,当接受一个客户端连接后,创建一个新的线程来处理该客户端的请求,这样,服务器的主线程可以继续接受其他客户端的连接,从而实现同时处理多个客户端的功能,通过这种方式,每个客户端连接都在自己的线程中进行处理,互不干扰。

2、如果服务器需要处理大量并发客户端连接,有没有更好的解决方案?

对于处理大量并发客户端连接的情况,可以考虑使用异步编程模型或更高级的并发处理机制,如使用asyncawait关键字进行异步操作,或者使用任务并行库(TPL)来更有效地管理线程资源,还可以使用一些高性能的网络编程框架,如SignalR等,这些框架提供了更高效的并发处理能力和更丰富的功能,适用于大规模的网络应用程序开发。