C# Socket客户端 多态服务器的有关问题
C# Socket客户端 多态服务器的问题.
需求:
1.利用C# Socket实现一个客户端程序,用来接收多台设备数据,根据数据协议解析出来,将数据添加到数据库.
2.考虑Socket断开重连问题,可能由于设备异常关闭,网络异常或者其他问题导致的接收数据错误以及接收不到的问题.
问题:
1.一个客户端对应多态服务器,用同步还是异步处理?查了资料,同步可能会造成阻塞,如何解决?异步,可能会出现粘包,断包的问题,比如异步处理函数中可能一次过来的有IP地址1或者IP地址2的数据.网上都是一台服务器对应多客户端的例子,实在找不到了.
2.问题2如果利用一个定时器去处理,时不时的对多态服务器进行连接,这样做行不行?
希望各位做过的人多给点意见,谢谢!
------解决思路----------------------
不论是你说的“同步”还是“异步”,出现粘包都是一样的情况。可能你只是看了别人的程序,而恰好有些所谓“同步”的程序是有bug的(没有处理粘包的),所以你才会以为同步不沾包。同步处理和异步处理,在处理命令解析上是一样的,区别只是异步代码更简洁一些,但是稍微需要一点理解里(因为毕竟写成分离的“委托回调形式”了)。
对于客户端而言,它访问每一个服务器都是使用一个独立的 TcpClient。也就是是说,如果你访问200个设备,那么你就有两百个TcpClient。例如你可以包装一个独立的类来实现设备网关:
然后如果有200个设备,就 new 200个设备对象进行单独的处理就行了。
当连接断掉的时候,不论是 BeginSend、EndSend 还是 BeginRead、EndRead都会抛出异常,你这个时候才开始定时“重连接”。而一旦连接成功,那么定时器终止。
当然你可以每隔几分钟随便发送什么不影响业务操作的消息(例如心跳消息),这样判断连接是否正常。
------解决思路----------------------
这要看是哪一种“设备”。许多设备跟 PC 不一样。设备不支持 DHCP 客户协议,而是采用 dip 拨动开关来设置固定的局域网 IP。
需求:
1.利用C# Socket实现一个客户端程序,用来接收多台设备数据,根据数据协议解析出来,将数据添加到数据库.
2.考虑Socket断开重连问题,可能由于设备异常关闭,网络异常或者其他问题导致的接收数据错误以及接收不到的问题.
问题:
1.一个客户端对应多态服务器,用同步还是异步处理?查了资料,同步可能会造成阻塞,如何解决?异步,可能会出现粘包,断包的问题,比如异步处理函数中可能一次过来的有IP地址1或者IP地址2的数据.网上都是一台服务器对应多客户端的例子,实在找不到了.
2.问题2如果利用一个定时器去处理,时不时的对多态服务器进行连接,这样做行不行?
希望各位做过的人多给点意见,谢谢!
------解决思路----------------------
不论是你说的“同步”还是“异步”,出现粘包都是一样的情况。可能你只是看了别人的程序,而恰好有些所谓“同步”的程序是有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。