不论是你说的“同步”还是“异步”,出现粘包都是一样的情况。可能你只是看了别人的程序,而恰好有些所谓“同步”的程序是有bug的(没有处理粘包的),所以你才会以为同步不沾包。同步处理和异步处理,在处理命令解析上是一样的,区别只是异步代码更简洁一些,但是稍微需要一点理解里(因为毕竟写成分离的“委托回调形式”了)。对于客户端而言,它访问每一个服务器都是使用一个独立的 TcpClient。也就是是说,如果你访问200个设备,那么你就有两百个TcpClient。例如你可以包装一个独立的类来实现设备网关:public class 设备 { public string 设备编号; public TcpClient Tcp; public syte[] Buffer; public NetworkStream Stream; ....... public event Action<MyCommand> CmdReceived; ....... public void Connect() { 初始化 Tcp; 初始化 Stream; 初始化BeginRead; } } 然后如果有200个设备,就 new 200个设备对象进行单独的处理就行了。当连接断掉的时候,不论是 BeginSend、EndSend 还是 BeginRead、EndRead都会抛出异常,你这个时候才开始定时“重连接”。而一旦连接成功,那么定时器终止。当然你可以每隔几分钟随便发送什么不影响业务操作的消息(例如心跳消息),这样判断连接是否正常。
这要看是哪一种“设备”。许多设备跟 PC 不一样。设备不支持 DHCP 客户协议,而是采用 dip 拨动开关来设置固定的局域网 IP。
既然是要跟硬件设备通信,必然是要设置成固定IP,而不是DHCP协议动态分配,否则重启之后还怎么去找对应的设备
硬件设备又不是客户机,有人操作
{
public string 设备编号;
public TcpClient Tcp;
public syte[] Buffer;
public NetworkStream Stream;
.......
public event Action<MyCommand> CmdReceived;
.......
public void Connect()
{
初始化 Tcp;
初始化 Stream;
初始化BeginRead;
}
}
然后如果有200个设备,就 new 200个设备对象进行单独的处理就行了。当连接断掉的时候,不论是 BeginSend、EndSend 还是 BeginRead、EndRead都会抛出异常,你这个时候才开始定时“重连接”。而一旦连接成功,那么定时器终止。当然你可以每隔几分钟随便发送什么不影响业务操作的消息(例如心跳消息),这样判断连接是否正常。
这要看是哪一种“设备”。许多设备跟 PC 不一样。设备不支持 DHCP 客户协议,而是采用 dip 拨动开关来设置固定的局域网 IP。
1. 不论是同步还是异步,都必须处理粘包。
2. 不论是你的上位机作为客户机还是服务器,你收发数据之前都肯定创建不同的 TcpClient 对象来对应不同的设备。
我知道 现在的板子都支持客户端模式以及服务端模式..但是提及到"控制" 大家可能想到所谓现在流行的智能家居.远程控制的话 肯定是要联网,那么他一定就是client.也就是通过wifi连接服务器tcp_client模式进行数据收发.属于他如果是服务器模式,只是用于联网控制, 比如 设备重启发射ap.然后连接ap使手机跟设备同一网段.手机属于client 设备是server 你通过tcp或者udp(看设备类型)把可联网ap的名字以及密码发给设备,设备就可以上网了.然后这个时候 设备又从server模式=>client模式..然后正常...我用过几款板子都是差不多这样...所以 我个人觉得LZ的东西还是有一些问题的..而且,最终你的设备是扔在哪?内网操作吗?
既然强调硬件设备,它里面大概是不能自己编程写通讯软件的,通讯是通过通信板