有关Socket-Tcp通信的坑..
一般C#编写Tcp客户端有两种方法对应两个类
1. Socket
C#的socket类创建后直接Connect方法就可进行连接,使用Send发送信息,Receice接收信息,或者采用流操作,获取socket的NetworkStream,发送信息改为将数据写入流中,接收信息改为从流中读取数据
下边是重点…
2. TcpClient
连接的代码就像下图一样没啥好说的…
接收数据的代码按理说应该直接从流里读出来就好了就像下图一样
然后出事了,异常信息为 “该流不支持查找功能”,我最开始以为是获取的流出了问题,查看了一下GetStream()的描述,如下图
翻译成人话就是,返回一个支持发送接收数据的网络流,这就很奇怪了,这不是写着支持接收数据吗…百度查了一下,一般的解决办法是使用循环将NetStream转换为MemoryStream内存流,我个人才用了CopyTo()
这里的话因为一般接收数据是开一个线程持续扫描然后向外读取数据,所以不建议使用异步方法容易造成混乱,但是很不幸当代码执行到read语句的时候还是阻塞在那里了…造成整个程序卡死
我查了半天也没查出解决办法,只能换用Socket进行通信了,所以这里建议大家,如果做客户端的数据接收还是要使用Socket,因为一般服务端接收数据都是采用TcpListener进行指定端口的监听,但是客户端一般来说自己是不知道开了哪个端口进行通信的(除非指定端口进行通信),所以一般无法开启监听,只能持续扫描然后从流中读取数据。