请教一个设计socket通信的问题

shi_hang_nk 2010-07-03 05:28:44
大家好,一个socket通信的问题,看看大家有没有好的思路

我正在设计一个数据接收软件,这个软件装在一台PC上,要和10台外围设备通信。外围设备是别人开发的,接口协议如下:

外设为服务器端,pc为客户端。在未建立连接时由pc向外设发出连接请求,外设在接收连接请求后进行一定的预处理,决定是否允许建立连接。

如果可以建立连接,存在二类接口:

1.外设成为数据发送的主动方,开始逐条发送消息包,发送每个消息后等待应答;pc接收到消息后进行处理,然后返回外设一个应答。

2.pc定期向各个外设发送心跳检测请求,接收各个外设的应答。

上述过程中,双方使用TCP协议,端口号均为10000。

基于上述需求,pc端如何设计呢?想请教一下大家的思路。
...全文
84 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chuliqiang 2011-01-10
  • 打赏
  • 举报
回复
我也在解决类似的问题,看看大家的回复吧!
kolosi 2010-07-04
  • 打赏
  • 举报
回复
就是实时数据更新是吧。

简单,只要pc端始终保持一个tcp的10000端口监听,只负责接受数据。

再开个新线程,定时刺激外设给你发数据就行了。

两部分几乎是没啥关系的。
  • 打赏
  • 举报
回复
哦,只是写了长连接。

其实短连接很简单,你的pc上的服务程序TcpListener每当Accept到一个连接(TcpClient),接收了消息直到缓冲区里的数据全被读取出来,把接收到的内容当作一个消息进行执行,把结果返回给设备,就可以立刻关闭这个TcpClient。这样可以自动地维护通信中的许多bug。并且每一个设备可以同时开10个线程来并行地访问pc以提高效率。

嗯,这些都是很平淡无奇的。我想不出什么比较酷的东西给你了。
  • 打赏
  • 举报
回复
对于长连接通讯来说,pc端Accept到了一个外设的联系,就会一直用这个联系(既TcpListener的Accept方法所获得的TcpClient对象)来Receive数据,并发送返回数据。具体地说就是一旦判断有缓冲中有数据(NetworkStream.DataAvailable)就接收数据,一旦缓冲中所有数据都接收完就开始解析这些数据,只把已经接收的数据中第一个数据包取出来执行,然后把执行结果通过这个TcpClient对象(而不是新创建一个TcpClient对象)发送给设备。接下来如果已经接收的数据中还有完整的消息,就重复处理下一个消息。

不知道你说的“pc定期向各个外设发送心跳检测请求,接收各个外设的应答”是通过最初作为客户端访问外设所创建的TcpLient,还是通过外设向pc发送数据时由服务程序所获得的TcpListener来发送心跳消息。这两个都是可以的,但是没有细节就没有真正的实现,设计协议时这种东西都是现有文档然后才能动手开发。

你说“外围设备是别人开发的,接口协议如下”,看来有些东西是已经写死了的,而有些东西你有缺乏架构的能力,这就有可能双方难以协同工作。
  • 打赏
  • 举报
回复
“基于上述需求,pc端如何设计呢?想请教一下大家的思路。”

我实在不知道你具体想问什么思路。有时候太简单的东西,反而完全无法清晰回答。总不能随便搜点字眼就贴过来吧?!

你已经说了,pc作为一个客户端,做两件事:
1. 通知外设自己开始监听,要求外设告诉自己是否开始发送以后的业务消息。
2. 检查外设时候还在工作。

pc首先创建一个TcpListener对象实例(端口10000)开始监听,然后分别(并行)作为客户端(TcpClient对象实例)访问各个外设的端口10000。

pc作为服务端,它监听一个一个Accept。但是不知道你如何设计协议的,首先我不知道你是基于长连接方式还是短连接方式来运行这些协议,也不知道在协议中你如何标记客户端是谁、如何解析数据。

这些东西都是一些死东西,不知道你到底在哪里有问题。但是我知道,如果你只是从网上抄了一些所谓“聊天”程序的范例,那么小心被拐带到沟里去。这些范例离真正的业务应用所应该设计的协议差得太远了。

111,096

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧