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

c 网络传输消息

网络传输消息摘要是一种确保数据传输完整性和安全性的技术,通过哈希/散列算法生成定长摘要,用于验证数据在传输过程中是否被修改。

在C中进行网络传输消息,通常可以使用套接字(Socket)编程来实现,以下是关于C网络传输消息的详细内容:

一、使用TCP协议传输消息

1、创建服务器端

首先需要创建一个TcpListener对象来监听客户端的连接请求,指定IP地址和端口号,例如监听本地的8000端口:

    TcpListener server = new TcpListener(IPAddress.Any, 8000);
    server.Start();
    Console.WriteLine("服务器已启动,等待客户端连接...");

通过AcceptTcpClient方法接受客户端的连接,该方法会阻塞线程,直到有客户端连接:

    TcpClient client = server.AcceptTcpClient();
    Console.WriteLine("客户端已连接!");

获取与客户端通信的网络流,用于读取和写入数据,这里使用NetworkStream

    NetworkStream stream = client.GetStream();

从网络流中读取客户端发送的消息,可以使用StreamReader来方便地读取字符串:

    StreamReader reader = new StreamReader(stream);
    string message = reader.ReadLine();
    Console.WriteLine("收到客户端的消息:" + message);

向客户端发送响应消息,使用StreamWriter写入要发送的数据:

    StreamWriter writer = new StreamWriter(stream);
    writer.WriteLine("服务器已收到消息:" + message);
    writer.Flush();

关闭与客户端的连接和相关资源:

    stream.Close();
    client.Close();
    server.Stop();

2、创建客户端

创建一个TcpClient对象并连接到服务器的IP地址和端口号:

    TcpClient client = new TcpClient("127.0.0.1", 8000);
    Console.WriteLine("已连接到服务器!");

获取与服务器通信的网络流:

    NetworkStream stream = client.GetStream();

向服务器发送消息,使用StreamWriter写入要发送的数据:

    StreamWriter writer = new StreamWriter(stream);
    writer.WriteLine("你好,服务器!");
    writer.Flush();

从服务器接收响应消息,使用StreamReader读取:

    StreamReader reader = new StreamReader(stream);
    string response = reader.ReadLine();
    Console.WriteLine("收到服务器的响应:" + response);

关闭与服务器的连接和相关资源:

    stream.Close();
    client.Close();

二、使用UDP协议传输消息

1、创建服务器端

创建一个UdpClient对象,绑定到本地的IP地址和端口号,用于接收客户端的消息:

    UdpClient server = new UdpClient(new IPEndPoint(IPAddress.Any, 8000));
    Console.WriteLine("UDP服务器已启动,等待客户端消息...");

使用Receive方法接收客户端发送的数据,该方法会阻塞线程,直到收到数据:

    byte[] buffer = server.Receive(ref remoteEndPoint);
    string message = Encoding.UTF8.GetString(buffer);
    Console.WriteLine("收到来自" + remoteEndPoint + "的消息:" + message);

向客户端发送响应消息,使用Send方法将数据发送到客户端的地址和端口:

    string responseMessage = "服务器已收到消息:" + message;
    byte[] responseData = Encoding.UTF8.GetBytes(responseMessage);
    server.Send(responseData, responseData.Length, remoteEndPoint);

关闭UdpClient

    server.Close();

2、创建客户端

创建一个UdpClient对象,用于发送和接收数据:

    UdpClient client = new UdpClient();
    IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8000);
    Console.WriteLine("已准备好向服务器发送消息!");

向服务器发送消息,将字符串转换为字节数组后发送:

    string message = "你好,UDP服务器!";
    byte[] data = Encoding.UTF8.GetBytes(message);
    client.Send(data, data.Length, serverEndPoint);
    Console.WriteLine("消息已发送到服务器!");

接收服务器的响应消息,使用Receive方法接收数据:

    byte[] buffer = client.Receive(ref serverEndPoint);
    string response = Encoding.UTF8.GetString(buffer);
    Console.WriteLine("收到服务器的响应:" + response);

关闭UdpClient

    client.Close();

三、注意事项

1、异常处理:在网络编程中,可能会出现各种异常情况,如网络中断、连接超时等,建议在代码中添加适当的异常处理机制,以提高程序的稳定性和可靠性,可以使用try-catch块来捕获和处理异常。

2、多线程处理:如果服务器需要同时处理多个客户端的连接请求,可以考虑使用多线程或异步编程技术,这样可以提高服务器的性能和响应速度,避免一个客户端的操作阻塞其他客户端的请求。

3、数据格式:在传输消息时,需要确保数据的格式正确,如果传输的是字符串,需要使用合适的编码方式进行编码和解码;如果传输的是二进制数据,需要确保数据的完整性和正确性。

4、安全性:在网络传输中,数据的安全性是非常重要的,可以考虑使用加密技术对数据进行加密,以防止数据被窃取或改动,还可以使用身份验证机制来确保通信双方的身份合法。

下面是一个简单的示例,展示了如何使用TCP协议在C中实现网络传输消息的服务器和客户端:

服务器端代码

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
class Server
{
    static void Main()
    {
        TcpListener server = null;
        try
        {
            // 创建TCP监听器,监听本地的8000端口
            IPAddress localAddr = IPAddress.Parse("127.0.0.1");
            server = new TcpListener(localAddr, 8000);
            server.Start();
            Console.WriteLine("服务器已启动,等待客户端连接...");
            // 接受客户端的连接请求
            TcpClient client = server.AcceptTcpClient();
            Console.WriteLine("客户端已连接!");
            // 获取与客户端通信的网络流
            NetworkStream stream = client.GetStream();
            // 从网络流中读取客户端发送的消息
            StreamReader reader = new StreamReader(stream);
            string message = reader.ReadLine();
            Console.WriteLine("收到客户端的消息:" + message);
            // 向客户端发送响应消息
            StreamWriter writer = new StreamWriter(stream);
            writer.WriteLine("服务器已收到消息:" + message);
            writer.Flush();
            // 关闭与客户端的连接和相关资源
            stream.Close();
            client.Close();
        }
        catch (SocketException e)
        {
            Console.WriteLine("SocketException: {0}", e);
        }
        finally
        {
            if (server != null)
            {
                server.Stop();
            }
        }
    }
}

客户端代码

using System;
using System.Net.Sockets;
using System.Text;
using System.IO;
class Client
{
    static void Main()
    {
        TcpClient client = null;
        try
        {
            // 创建TCP客户端,连接到服务器的IP地址和端口号
            client = new TcpClient("127.0.0.1", 8000);
            Console.WriteLine("已连接到服务器!");
            // 获取与服务器通信的网络流
            NetworkStream stream = client.GetStream();
            // 向服务器发送消息
            StreamWriter writer = new StreamWriter(stream);
            writer.WriteLine("你好,服务器!");
            writer.Flush();
            // 从服务器接收响应消息
            StreamReader reader = new StreamReader(stream);
            string response = reader.ReadLine();
            Console.WriteLine("收到服务器的响应:" + response);
            // 关闭与服务器的连接和相关资源
            stream.Close();
            client.Close();
        }
        catch (ArgumentNullException e)
        {
            Console.WriteLine("ArgumentNullException: {0}", e);
        }
        catch (SocketException e)
        {
            Console.WriteLine("SocketException: {0}", e);
        }
        catch (IOException e)
        {
            Console.WriteLine("IOException: {0}", e);
        }
        catch (InvalidOperationException e)
        {
            Console.WriteLine("InvalidOperationException: {0}",e);
        }
    }
}

| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |