有关socket间信息的发送……帮忙给看看吧! ( 积分: 30 )

  • 主题发起人 主题发起人 sword_911
  • 开始时间 开始时间
S

sword_911

Unregistered / Unconfirmed
GUEST, unregistred user!
关于这个问题,是这样的,在C端的连续几条
c_socket.Socket.sendtext('******');
c_socket.Socket.sendtext('545#13#10');
c_socket.Socket.sendtext('fddfg ');的执行
在S端会被认为是同一个socket.ReceiveText吗?我实验的结果是:是的!
也就是说socket.ReceiveText=*****545#13#10fddfg

但是,我需要让C端这样分开发来的信息在S端也是各自分开的!!
具体的说,我是想让C端连续发来的信息,分别显示在S端的treeview中每个结点上!
行吗?
怎么做啊?
谢谢!!! 在线等等……
 
关于这个问题,是这样的,在C端的连续几条
c_socket.Socket.sendtext('******');
c_socket.Socket.sendtext('545#13#10');
c_socket.Socket.sendtext('fddfg ');的执行
在S端会被认为是同一个socket.ReceiveText吗?我实验的结果是:是的!
也就是说socket.ReceiveText=*****545#13#10fddfg

但是,我需要让C端这样分开发来的信息在S端也是各自分开的!!
具体的说,我是想让C端连续发来的信息,分别显示在S端的treeview中每个结点上!
行吗?
怎么做啊?
谢谢!!! 在线等等……
 
每条信息已 #13#10 作为结束符.
 
to:summax 不行我就是这么做的!!若是让它显示在label上,会回车换行。
若是让它加入treeview的结点,没反映,跟不加13 10一样
 
正好同样有相同的问题,帮顶
在两个SendText之间放上一些延时Sleep(100),会起效
但是延时这方法很渣
 
其实对于你这个东西的方法是可以这样来
定义一个报文
报文头上写上字串所需要的总数
总数后面接上每个字串的长度,然后是每个字串

形成这样的一个结构
字串总数(int)+{字串长度(int)+字串(str)}
如此这样成一个报文来解释


不过我的问题是在于已经有报文了,我要连续发两个这样的报文
当然不可能在已经定义好的报文上再做报文头,太复杂了

如果有Socket.Validate之类的方法就好了
 
回sephy, 两层报文不算多呀。而且我也不觉得复杂,不就每层两个函数?
TCP/IP的应用层数据到物理层都不知用了多少层数据报了(不记得很清楚>3层)
 
Socket控件如TTcpServer,TTcpClient等,应该具有sendln,和readln等方法,看看Delphi的帮助。
 
TCP/IP也只不过4层(或有说法5层)
不过已经在第3层的传输层上的TCP协议上写东西了
再写2层的话,"绝对高度"就比最高的HTTP/FTP之类都要高了,说明了什么问题呢?
当然第一还是说明报文定义的不好,太冗余了,的确也是问题
不过报文都已经这么定好了,要改太繁复了
还是想这么直接解决掉
 
给个提示,用Timer解决这类问题。
 
延时这方法很渣
尤其是放在服务器端的
一个两个TTimer还可以,使用流量大了,Timer多了之后很是一个问题
而且如果机器负载上去了,TTimer这种东西...不知道会拖到什么时候才被系统响应
我不太相信有一个好的应用程序会用 延时 来解决问题
 
c_socket.Socket.sendtext('******');
Application.ProcessMessages;
c_socket.Socket.sendtext('545#13#10');
Application.ProcessMessages;
c_socket.Socket.sendtext('fddfg ');
Application.ProcessMessages;
 
楼上你测试过么?
在我的机器这样一个都分不开
ProcessMessages的时间太短了
 
不行的,最终还是要你自定一个协议包的;
一下收到几个包也好办,逐步拆分就是;
 
c_socket.Socket.sendtext('******'+#13#10+'545#13#10'+#13#10+'fddfg');
不知道这样行不行?
没经过测试!
 
关 注 中....
 
楼主应该是在用tcp吧,流式的数据在系统缓冲中是连续存放的
其实udp也一样
解决很简单,每个c发出的包都用一个包头标识和一个包尾标识进行包装,例如
@@@.........$$$
包头标识就是@@@,包尾标识是$$$,中间是你的字符数据
这样在接收端s上可能收到这样的数据
@@@......$$$@@@.......$$$@@@..............$$$
所以你就可以分割出三段数据,也就是c三次发送的内容了。这种包装是socket数据通信最常用的方法
 
islet8这方法,要是想发$$$怎么办?
转义? 麻烦么...
 
我只是举例阿,你也可以用那些非常用字符来做包头标记和包尾标记,比如ascii在128-255的那些,当然,内容中就不能再出现这些字符了,只能转义,所以用那些罕用字符做标识符比较好,转义的次数就会非常少了
比如用#233#233#233开头,#244#244#244结尾的一个包,如果内容中有#233或#244的字符就转义成#238#233(或者#238#244,#238就是转义符,这个其实也是随意的),然后对于#238的字符就用两个#238(#238#238)表示就没问题了,道理类似c++里的//,/t,/n什么的
 
最简单的自定义协议包。
数据长度,数据,数据长度,数据…………………………

比你什么符号之类的好用,更不用转义!
 
后退
顶部