关于socket的问题(120分)

  • 主题发起人 主题发起人 BiJ
  • 开始时间 开始时间
B

BiJ

Unregistered / Unconfirmed
GUEST, unregistred user!
我用serversocket.sendtext发送string时发现,连续使用sendtext发送string,在client端只能收到一个string,这个string包含了所有string的内容.请问各位大虾,如何才能在client端收到分开的string呢?

 
这和socket的发送机制有关。试一下你就会发现,如果你发'a','a','b',
收到的可能是'a','b','a';事实上可能是它们的任何排列。

要求明确的收发,我觉得你应该自己控制。
比如说,对每一string都加上编号,自己组装;
每一次连接都只送一个string.
 
1.server发一串后,等回答后再发另一串.

2.server发的串后都加一结束标志, client收到后按标志分开.
 
1.server发一串后,等回答后再发另一串.

2.server发的串后都加一结束标志, client收到后按标志分开.
 
事实上,我现在是一个server将几个文件分别传给不同的client
其中含有二进制文件,本来我打算使用sendtext来传送控制信息
如果照各位方法,我还要为每个client准备一个控制变量来标志
当前传送的位置,可显然client的个数是不固定的,难道还要动态
生成.
传一个string就绪一个连接,效率是不是太差了一点把?
 
事实上,我现在是一个server将几个文件分别传给不同的client
其中含有二进制文件,本来我打算使用sendtext来传送控制信息
如果照各位方法,我还要为每个client准备一个控制变量来标志
当前传送的位置,可显然client的个数是不固定的,难道还要动态
生成.
传一个string就绪一个连接,效率是不是太差了一点把?
 
还有其他办法吗?
小弟这里有礼了.
 
server与每个client应分别有一个connection.每一个string不必要一个连接.
 
我猜想这和Socket的发送方式有关. 平时我们使用的是异步方式. 如果使用
同步方式是不是可以正常呢?
 
BiJ:
你可以在每个String中加上标识符,以标志串头和串尾,
以及各串编号,然后自己控制.
 
谁能解释同步与异步的区别呢?
 
1.如果您用的是TCP,如果提交的是'a','a','b',那么端基本上可以肯定接收
端收到的是'a','a','b',而不会是其它组合.如果系统这一点都做不到,肯
定是有重大的问题了,也许应该重装所有软件/硬件.所以,不必担心串到达
的顺序,而只需要在串之间加串结束标志就可以了.
2.提交几个串,client收到的可能是合并后的串.这是因为TCP开了一个缓冲
区,只有缓冲区满(或放到缓冲区的数据已经等待一定时间)之后,系统才
将整个缓冲区发送出去.所以,要式客户端收到的数据是基本分开的(如果
客户端数据处理过程被耽搁了,客户端的TCP又会将后面到达的数据与前面
的数据合并,所以只能保证基本分开),需要在每次提交数据后显示刷新
TCP的缓冲区.不同的SOCKET封装、不同的控件其刷新操作的方式都不
一样,您可以查一下其HELP.
3."同步"指提交一个SOCKET请求之后,直到系统完成操作或超时后才返回
的方式."异步"指提交SOCKET请求之后马上返回,系统在后台进行真正
的操作,当操作完成后向程序发送消息的方式.不建议采用同步方式,因
为网络操作常常会有相当的延时,此时界面就得不到刷新,给人很不好
的印象.另外,有很多SOCKET控件是用循环检测状态的方法,以异步操作
的方式模拟同步方式.这种"同步"是很危险的,如果没有深厚的多任务
并行处理的编程经验,最好不要使用.
 
非常谢谢lhz.
可是我还有一个疑问.当我在server端使用sendstream方法时,在client端会收到一个非常大的buffer.
这是否是因为client端的延迟,还是由于其它原因呢?
 
网络通信是一个非常复杂的问题.在任何环节都有可能造成
阻塞,所以,任何环节的影响都可能形成非常大的buffer.
例如,网络突然的拥挤可能使TCP的显示刷新都失效,而在
服务器上合并几次提交的数据.

如果一定要按包传送,可以用UDP协议.UDP可以保证每次
提交的数据都独立形成一个包传输到客户端,但UDP不能
保证数据正确传输到对方,也不能保证数据是按顺序到达
对方.相应地您的程序就要有这些处理.
 
使用 TWinSocketStream.Write(buffer, Length(buffer) + 1);
 
后退
顶部