一个程序监听多个端口常见吗,求个思路

.Net技术 码拜 8年前 (2017-04-14) 1742次浏览
局域网内有个电脑,电脑有个C#程序,程序要和若干台安卓手机通信。
手机想要的请求也有几种类型,例如要求电脑: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

引用:
Quote: 引用:

例如  [命令包包头验证][控制码][数据]

引用:

常用的方案是:发送数据添加4字节的“包头”,表示后续数据的长度。接收时根据前4个字节来处理数据完整性及粘包等问题。

每个手机会发来一个socket,假如用阻塞的Receive函数,是不是每个socket都得建立个线程?

tcp服务端都是这么设计的啊
来一个request就开个线程去处理
while(!terminated)
{
socket=tcp.Accept();
handlesocket(socket);
}

2

不常见
只需要创建一个socket
就算是阻塞的Receive,也不要开启过多线程去处理,应该用线程池

2

为每个socket建一个线程是非常不可取的做法。原因是这些线程大部分时间都处于等待状态,是严重浪费系统资源的行为。
假如想学习socket,就不要抗拒使用:AsyncXXX或BeginXXX,EndXXX这些方法。

2

 假如做一个产品要考虑的东西很多。并发,安全,7*24小时不间断运行。
假如仅仅做这样一功能,随便写下呗,不行的就重新启动一下服务程序。

2

2

引用:
Quote: 引用:

例如  [命令包包头验证][控制码][数据]

引用:

常用的方案是:发送数据添加4字节的“包头”,表示后续数据的长度。接收时根据前4个字节来处理数据完整性及粘包等问题。

每个手机会发来一个socket,假如用阻塞的Receive函数,是不是每个socket都得建立个线程?

就算是用循环阻塞式的Accept操作,那么Receive操作也应该使用异步的方式,避免滥用线程。

2

引用:
Quote: 引用:

tcp服务端都是这么设计的啊
来一个request就开个线程去处理

引用:

应该用线程池

除了用心跳包的思路,receive函数能不能用异常等手段监测到手机执行了 close socket,有什么异常可用用呢。也除了本人设计封包格式。还有什么可用的思路

关闭了就会抛出异常

2

引用:
Quote: 引用:

关闭了就会抛出异常

是 ObjectDisposedException 吧?

假如close没收到,也有可能是别的


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明一个程序监听多个端口常见吗,求个思路
喜欢 (0)
[1034331897@qq.com]
分享 (0)