C# 网络编程之使用Socket类Send、Receive方法的同步通讯
本文是多年前的分享,主要介绍C#网络编程,使用Socket类Send和Receive方法开发的客户端和服务端的同步通讯程序;实现了又客户端想服务器发送消息的界面程序.主要使用的方法是:
1.Socket套接字编程的知识,通过IPAddress定义一个IP地址,IPEndPoint定义一个主机,Socket实例套接字对象sock和线程Thread的的成员变量;
2.再调用方法bind绑定端口、listen监听端口、accept接受连接请求、connect请求连接来连接客户端和服务器;
3.建立连接后通过Send和Receive方法通过线程循环接受连接请求中发送的消息,实现通信并显示在相应的控件中;
4.最后调用socket的close和shutdown方法关闭套接字,停止连接监听.
下面是程序运行后的结果:
(服务端接受客户端发送的消息:这是一个单方的通信,但实现双方的方法相同,因为服务端的"欢饮使用本服务器"也反馈显示在了客户端)
(客户端)
服务端
客户端
该程序中我遇到的几个主要问题及解决方法如下:
1.程序初期总是很卡,出现多次未响应情况?
因为socket的Accept()函数是阻塞模式,它的执行会造成程序的阻塞,应该把它放置到线程中执行,否则会阻塞当前线程,出现卡死状态不响应消息,后续代码也不会执行,所以需要把accept放到创建的线程thread中,放入targett()函数中的“socklin = sock.accept()”即可实现;
2.在定义的socket对象实例中sock与socklin(临时接受客户端连接请求)中混淆?
socklin = sock.accept,它就是客户端发送连接的请求,因此在判断连接时是if(socklin.Connected),同时使用socklin的send和receive方法发送和接受数据;
3.总是出现“线程间操作无效:从不是创建控件的线程访问它”的错误?
因为windows窗体控件不是线程安全的,如果几个线程操作某一控件的状态,可能会使该控件的状态不一致,出现争用或死锁状态.我采用的解决方法是添加Form的载入load事件,在load时将CheckForIllegalCrossThreadCalls 属性的值设置为 false .这样进行非安全线程访问时,运行环境就不去检验它是否是线程安全的.
总结:
最后经过一星期的学习与查阅资料,还是把这个程序弄出来了,也学到了很多东西,同时感谢上面的博主和一些书籍.希望这篇文章对大家有用,有错或不足之处见谅!
感恩能与大家在华为云遇见!希望能与大家一起在华为云社区共同成长。
(By:娜璋之家 Eastmount 2021-10-25 夜于武汉)
- 点赞
- 收藏
- 关注作者
评论(0)