局域网内有个电脑,电脑有个C#程序,程序要和若干台安卓手机通信。
手机想要的请求也有几种类型,例如要求电脑:1、把数据库的东西传给本人,MySQL数据库里面有utf8字符串,有整数,有图片路径,把这3者用TCP发给安卓手机
第二种要求:本人是手机,本人这有几条记录,本人发给你电脑,你电脑用热敏打印机给本人打出来。
手机想要的请求也有几种类型,例如要求电脑:1、把数据库的东西传给本人,MySQL数据库里面有utf8字符串,有整数,有图片路径,把这3者用TCP发给安卓手机
第二种要求:本人是手机,本人这有几条记录,本人发给你电脑,你电脑用热敏打印机给本人打出来。
解决方案
2
你这个需求只需要监听一个端口就行了啊
本人设计下封包格式
例如 [命令包包头验证][控制码][数据]
本人设计下封包格式
例如 [命令包包头验证][控制码][数据]
2
为什么要监听多个端口,一个就够了。
例如:
例如:
class 命令<T> { //命令类型 public string type { get; set; } //命令参数 public T data { get; set; } } class 结果<T> { //命令执行能否成功 public bool success { get; set; } //执行成功后返回的数据 public T data { get; set; } //执行失败后返回的错误信息 public string error { get; set; } }
你要做的就是根据不同的命令定义不同的命令类和结果类。
传输时将相关类的实例序列化为json或xml字符串,再用encoding转为byte[]传输。
由于用的是TCP协议,所以不用考虑丢包及顺序,只要处理粘包即可。 常用的方案是:发送数据添加4字节的“包头”,表示后续数据的长度。接收时根据前4个字节来处理数据完整性及粘包等问题。
2
tcp服务端都是这么设计的啊
来一个request就开个线程去处理
while(!terminated)
{
socket=tcp.Accept();
handlesocket(socket);
}
2
不常见
只需要创建一个socket
就算是阻塞的Receive,也不要开启过多线程去处理,应该用线程池
只需要创建一个socket
就算是阻塞的Receive,也不要开启过多线程去处理,应该用线程池
2
为每个socket建一个线程是非常不可取的做法。原因是这些线程大部分时间都处于等待状态,是严重浪费系统资源的行为。
假如想学习socket,就不要抗拒使用:AsyncXXX或BeginXXX,EndXXX这些方法。
假如想学习socket,就不要抗拒使用:AsyncXXX或BeginXXX,EndXXX这些方法。
2
假如做一个产品要考虑的东西很多。并发,安全,7*24小时不间断运行。
假如仅仅做这样一功能,随便写下呗,不行的就重新启动一下服务程序。
假如仅仅做这样一功能,随便写下呗,不行的就重新启动一下服务程序。
2
2
例如 [命令包包头验证][控制码][数据]
常用的方案是:发送数据添加4字节的“包头”,表示后续数据的长度。接收时根据前4个字节来处理数据完整性及粘包等问题。
每个手机会发来一个socket,假如用阻塞的Receive函数,是不是每个socket都得建立个线程?
就算是用循环阻塞式的Accept操作,那么Receive操作也应该使用异步的方式,避免滥用线程。
2
tcp服务端都是这么设计的啊
来一个request就开个线程去处理应该用线程池
除了用心跳包的思路,receive函数能不能用异常等手段监测到手机执行了 close socket,有什么异常可用用呢。也除了本人设计封包格式。还有什么可用的思路
关闭了就会抛出异常
2
关闭了就会抛出异常
是 ObjectDisposedException 吧?
假如close没收到,也有可能是别的