工程项目中通讯协议常见问题

目录

  • 一、几种常见协议差别
  • [二、C# HTTP通讯协议代码示例](# HTTP通讯协议代码示例)
  • [三、C# Modbus TCP通讯协议代码示例](# Modbus TCP通讯协议代码示例)
  • [四、C# Socket通讯协议代码示例](# Socket通讯协议代码示例)

一、几种常见协议差别

在日常工作中我们总是会听到提到socket、tcp/ip协议、modbus tcp协议、HTTP协议等常用通讯协议,下面我们了解一下这些通讯协议的关系和区别,TCP/IP协议族通常分为‌四层:

TCP/IP协议族包含网络层(IP协议)和传输层(TCP/UDP协议),而应用层协议(如HTTP、Modbus TCP)运行在传输层之上。‌Socket‌是更底层的编程接口,支持TCP和UDP等协议。在C#中,Socket类提供了更灵活的控制,但需要处理更多底层细节,如连接管理、数据发送和接收‌,用于实现进程间网络通信‌。

下面这张图更加清楚的表明了这种关系。

二、C# HTTP通讯协议代码示例

下面代码展示了C# 使用HTTP协议通讯的整个过程。

下面是服务端伪代码:

csharp 复制代码
HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://127.0.0.1:5088/");
listener.Start();

// 等待请求
HttpListenerContext context = listener.GetContext();
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;

// 读取请求体中的JSON数据
string jsonContent;
using (var reader = new StreamReader(request.InputStream, request.ContentEncoding))
{
    jsonContent = reader.ReadToEnd();
    Dictionary<string, object> dictionary = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonContent);
}
                            

下面是客户端伪代码:

csharp 复制代码
private static readonly HttpClient client = new HttpClient();
var values = new Dictionary<string, string> {{ "imgPath"," "}};
var content = new FormUrlEncodedContent(values);
HttpResponseMessage response = await client.PostAsync(url, content);
response.EnsureSuccessStatusCode();
pythonResult=await response.Content.ReadAsStringAsync();

三、C# Modbus TCP通讯协议代码示例

csharp 复制代码
ModbusTCP modbusTCP = new ModbusTCP("192.168.3.1", 502);
modbusTCP.ConnectExecute();

string strReadValue = modbusTCP.ReadExecute("real", byte.Parse("1"), ushort.Parse("24"));
modbusTCP.WriteExecute("real", "0", byte.Parse("1"), ushort.Parse("16"));

public class ModbusTCP
{
    private ModbusFactory modbusFactory;
    private IModbusMaster master;
    private TcpClient tcpClient;
    public string IPAdress { get; set; }
    public int Port { get; set; }

    public bool Connected
    {
        get => tcpClient.Connected;
    }

    public ModbusTCP(string ip, int port)
    {
        IPAdress = ip;
        Port = port;
    }
    public void WriteExecute(string VariableType, string WriteValue, byte SlaveID, ushort WriteAddress)
    {
        try
        {
            if (VariableType == "real")
            {
                ushort[] buff = new ushort[2];
                float value = float.Parse(WriteValue);
                MODBUS.SetReal(buff, 0, value);
                WriteMultipleRegisters(SlaveID, WriteAddress, buff);
            }
            else if (VariableType == "string")
            {
                ushort[] buff = new ushort[10];
                MODBUS.SetString(buff, 0, WriteValue);
                WriteMultipleRegisters(SlaveID, WriteAddress, buff);
            }
            else if (VariableType == "Int16")
            {
                ushort[] buff = new ushort[1];
                short value = short.Parse(WriteValue);
                MODBUS.SetShort(buff, 0, value);
                WriteMultipleRegisters(SlaveID, WriteAddress, buff);
            }
        }
        catch (Exception ex)
        {
            //Msg.Info(ex.Message);
        }
    }
	public string ReadExecute(string VariableType, byte SlaveID, ushort ReadAddress)
    {
        string ReadValue = string.Empty;
        if (VariableType == "real")
        {
            ushort[] buff = ReadHoldingRegisters(SlaveID, ReadAddress, 2);
            float value = MODBUS.GetReal(buff, 0);
            ReadValue = value.ToString();
        }
        else if (VariableType == "string")
        {
            ushort[] buff = ReadHoldingRegisters(SlaveID, ReadAddress, 10);
            ReadValue = MODBUS.GetString(buff, 0, 10);
        }
        else if (VariableType == "Int16")
        {
            ushort[] buff = ReadHoldingRegisters(SlaveID, ReadAddress, 1);
            short value = MODBUS.GetShort(buff, 0);
            ReadValue = value.ToString();
        }
       
        return ReadValue;
    }
        
     public void ConnectExecute()
     {
         modbusFactory = new ModbusFactory();
         tcpClient = new TcpClient();
         tcpClient.Connect(IPAdress, Port);

         master = modbusFactory.CreateMaster(tcpClient);
         master.Transport.ReadTimeout = 2000;
         master.Transport.Retries = 5;
     }   

四、C# Socket通讯协议代码示例

csharp 复制代码
Socket ClientSocket;
IPAddress ip = IPAddress.Parse("192.168.2.25");  //将IP地址字符串转换成IPAddress实例
int port = 2001;
IPEndPoint endPoint = new IPEndPoint(ip, port); //用指定的ip和端口号初始化IPEndPoint实例
//使用指定的地址簇协议、套接字类型和通信协议
ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ClientSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, true);     //必须先启用接收超时选项,设置接收超时才有用。   
ClientSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, true);
ClientSocket.ReceiveTimeout = 3000;
ClientSocket.SendTimeout = 1000;
ClientSocket.Connect(endPoint);

//上面是ClientSocket初始化,下面是发送和接受的过程
byte[] byteArray = System.Text.Encoding.Default.GetBytes("start");
int W = ClientSocket.Send(byteArray, byteArray.Length, SocketFlags.None);
while (true)
{
    byte[] recv_buffer = new byte[1024];
    int real_recv = ClientSocket.Receive(recv_buffer);  //接收浏览器的请求数据
    if (real_recv > 0)
    {
        qrcodeContent = Encoding.UTF8.GetString(recv_buffer, 0, real_recv);
        qrcodeContent = qrcodeContent.Trim();
        break;
    }

}
相关推荐
Eiceblue8 小时前
C# 如何实现 Word 转 Excel ?分享两种实用方法
c#·word·excel
天才少女爱迪生8 小时前
word格式规范检测+自动修改【python】
python·c#·word
lbb 小魔仙9 小时前
2026远程办公软件夏季深度横测:ToDesk、向日葵、网易UU远程全面对比,远控白皮书
android·服务器·网络协议·tcp/ip·postgresql
用户3721574261359 小时前
如何使用 C# 转换 PowerPoint 为 HTML:完整指南
c#
Andya_net9 小时前
网络安全 | TCP三次握手与四次挥手
网络·tcp/ip·web安全
上海云盾-小余9 小时前
TCP 碎片攻击深度剖析:漏洞成因、流量甄别与高防加固实操方案
网络·网络协议·tcp/ip
软泡芙10 小时前
【C# 】各种等待大全:从入门到精通
开发语言·c#·log4j
牛大兵10 小时前
IP扫描,局域网内扫描IP地址,找出有用,未使用的。正在使用的信息
服务器·网络·tcp/ip
minji...10 小时前
Linux 网络套接字编程(七)TCP服务端和客户端的实现——网络版本计算器
linux·运维·服务器·网络·c++·tcp/ip·udp
夏霞11 小时前
IIS 应用程序池 3 种标识:ApplicationPoolIdentity / LocalSystem / LocalService 权限区别(超清晰)
c#·.net