我不是很明白你的意思,主要你没说服务器端的具体细节。
客户端也是block模式吗?如果是的话
客户端ClientSocket去connect,成功后connect才会返回,这时候服务器
的TServerClientThread线程会被创建,TServerClientThread的execute是你自己实现,里面应该就是用TWinSocketStream接收数据。
在线程外部(“客户端也使用了一个线程”),你引用ClientSocket的Socket
我觉得这个Socket就是新建立起来的那个,你发送数据还是应该会被TWinSocketStream接收倒(服务器不会另外创建线程),你可以查看
clientsocket的socket信息,或者在服务器端设置断点。我不是很明白你的意思,只能帮到这了。
另外,如果你要发送文件为什么一定要放在线程外部?
客户端也是block模式吗?如果是的话
客户端ClientSocket去connect,成功后connect才会返回,这时候服务器
的TServerClientThread线程会被创建,TServerClientThread的execute是你自己实现,里面应该就是用TWinSocketStream接收数据。
在线程外部(“客户端也使用了一个线程”),你引用ClientSocket的Socket
我觉得这个Socket就是新建立起来的那个,你发送数据还是应该会被TWinSocketStream接收倒(服务器不会另外创建线程),你可以查看
clientsocket的socket信息,或者在服务器端设置断点。我不是很明白你的意思,只能帮到这了。
另外,如果你要发送文件为什么一定要放在线程外部?
我问的就是,我在客户断发请求,是用ClientSocket1.Socket.SendBuf(buffer, sizeof(databuffer))吗?不然应改如何做呢?
感谢你的回答,不管解决与否,定然给分。
在现线程的执行过程中是可以做这两件事情的。
客户端线程类
TclientThread = class(TThread)
Private
sRequestStr : String;
MySocket : TClientSocket;
Public
Constructor Create();//里面要创建MySocket的实例,并进行初始化(服务器地址等)
Procedure Execute;override;
end;
Procedure Execute;override//实现
begin
Try
MySocket.Connect;//连接成功后会返回,失败则处理 Except
MySocket.Socket.SendText(sRequestStr)//发送请求
//接收服务器发送的文件数据
while (not Terminated) and MySocket.Active do
begin
Stream := TWinSocketStream.Create(ClientSocket.Socket,8000);
FillChar(Buffer,SizeOf(Buffer),0);
if Stream.WaitForData(8000) then
begin
if Stream.Read(Buffer,30) <> 0 then
begin
//接收文件
end;
end; Except
//处理异常
end;
end;
不知我理解的对不对
我知道客户端当然可以接收,发送。但是,请注意:你贴的
Try
MySocket.Connect;//连接成功后会返回,失败则处理 Except
MySocket.Socket.SendText(sRequestStr)//发送请求
在循环外面,而且是Execute的里面的处理。之后进入与服务端交互。这样一来,我的客户端主线程需要发数据时该怎么办?我正注意听,请继续指教!
MySocket对象会随着连接的消失而释放。我的客户端主线程需要发数据时该怎么办
----
那就在创建一个连接,让server新开一个线程为这个连接(请求)服务另外如果你有需求一定要在两个不同线程中用同一个Socket,我觉得你还得说的更具体一点。
一个请求一个应答一次连接?这可不行,因为存在这种需求:有时在客户端未请求时,服务端也会给客户端发信息。连接是不能断的。关键就是客户端主线程如何参与客户端工作线程与服务端的交互。我现在考滤这样处理:
建立一个请求队列,给线程书写发送请求队列中的请求的过程,SendRequest,然后如下循环,当主线程有请求时,将请求加入队列,当服务端主动有数据发过来时,也可在线程中通过ReceiveData(TheStream);接受 。
while (not Terminated) and (Form1.ClientSocket1.Active) do
begin
SendRequest; //发送请求队列中的请求
ReceiveData(TheStream); //接受数据
end;
不知是否妥当?请大家讨论。谢谢,都会有分。
具体怎么做我也忘了。:(
while (not Terminated) and (Form1.ClientSocket1.Active) do
begin
winsock.Select(...);
case .. of
Write: SendRequest; //发送请求队列中的请求
Read: ReceiveData(TheStream); //接受数据
end;
end;