Socket.SendText的问题:同一个字符串一次SendText成功;分做两次SendText为什么就不成功?(10分)

  • 主题发起人 主题发起人 ucan1
  • 开始时间 开始时间
U

ucan1

Unregistered / Unconfirmed
GUEST, unregistred user!
Socket.SendText的问题:同一个字符串一次SendText成功;分做两次SendText为什么就不成功?
(clientsocket为阻塞模式)

1.
一次SendText:
s:=TStringList.Create;
s.Add('aaa');
s.Add('bbb');
s.Add('ccc');
s.Add('ddd');
clientsocket.Socket.SendText(s);
s.free;
发送成功;


两次SendText:
s:=TStringList.Create;
s.Add('aaa');
s.Add('bbb');
clientsocket.Socket.SendText(s);
s.free;

s:=TStringList.Create;
s.Add('ccc');
s.Add('ddd');
clientsocket.Socket.SendText(s);
s.free;
发送不成功;
如果一个字符串我要分多次SendText;那如何才能使得它们发送成功呢???


2.
还有一个比较奇怪的问题:
帮助里说SendText returns 0 if the string was successfully written.
但是
s:=TStringList.Create;
s.Add('aaa');
s.Add('bbb');
s.Add('ccc');
s.Add('ddd');
i:=clientsocket.Socket.SendText(s);
if i <> 0 then
showmessage('111');
s.free;
结果字符串s发送成功;但是却执行了showmessage('111')这条语句;按道理这句话不应该执行得呀。


3.
clientsocket的onWrite事件干啥用的?
上面这些SendText的代码我是放在onConnect事件里的;是不是应该放在onWrite事件里???
 
各位大虾,帮帮偶啦
 
1 阻塞模式,怎么可以让你连续发两次?分成两次发的话,不能在一个procedure里面,必须要等到clientsocket其它的响应事件后,才能发第二次。
2 sendtext的返回值是发送的字节数,不是成功与否。
3 感觉上第二次发送应该是在onread中,这才是阻塞式的一种应答模式。

参考:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1306902
 
Determines which asynchronous events the socket can receive.

type
TAsyncStyle = (asRead, asWrite, asOOB, asAccept, asConnect, asClose);

TAsyncStyles = set of TAsyncStyle;

property ASyncStyles: TAsyncStyles;

Description

Use ASyncStyles to determine what sorts of notifications the socket needs to respond to. Set ASyncStyles to change the notifications that the socket receives from the socket connection. ASyncStyles is a set drawn from the following values

Value Meaning

asRead The socket receives notification that the connection is ready for reading.
asWrite The socket receives notification that the connection is ready for writing.
asOOB The socket receives notification when out-of-band data arrives.
asAccept The socket receives notification when another socket requests a connection.
asConnect The socket receives notification when a communication link to another socket is opened.
asClose The socket receives notification when a communication link to another socket is terminated.

Any notification specified by ASyncStyles arrives as a window message to the Handle property.

Note: If the socket is a non-blocking socket, then ASyncStyles should include asRead and asWrite so that the socket will be informed of asynchronous reading and writing events.
 
socket.ASyncStyles := [asRead, asWrite, asOOB, asClose];
 
阻塞模式下,我要在一个procedure下多次sendText不行么?
该怎么办才能多次sendText?
 
:=TStringList.Create;
s.Add('aaa');
s.Add('bbb');
s.Add('ccc');
s.Add('ddd');
//s应该是string不是TStringList
i:=clientsocket.Socket.SendText(s);
 
TO:张无忌
TStringList就是string呀,只不过后面加了#13#10罢了
 
TStringList是类,String是一种数据类型,怎么会一样?[:(]
 
张无忌,我看问题不是出在你说的那个点上;
那为什么
一次SendText:
s:=TStringList.Create;
s.Add('aaa');
s.Add('bbb');
s.Add('ccc');
s.Add('ddd');
clientsocket.Socket.SendText(s);
s.free;
发送成功;
 
还是思路方面的问题。
在一定的方式下,你连续的sendtext是可以的。但是对于接收方来说,可不能保证能收到全部的内容。
在sendtext成功后,程序控制应该会转向的,转到了clientsocket的一个事件。
 
ucan1:你的代码编译都通过不了,怎么能正常运行, 除非你修改编译器?
 
TO:armyjiang
我这里服务器端的接收可以不管,因为服务器端的软件已经做了这方面的工作。
在sendtext成功后,程序控制应该会转向的,转到了clientsocket的一个事件。
转到了什么事件?

TO:张无忌
sorry
应该是clientsocket.Socket.SendText(s.text);
 
这个你自己试一下就清楚了,省得我这边再建环境了。
在sendtext后,showmessage,另外,在clientsocket的所有事件中加上showmessage,进行跟踪判断。
 
非常感谢各位大虾的帮助!

礼轻情谊重哦 ^:^
 
后退
顶部