我不是很明白你的意思,主要你没说服务器端的具体细节。
客户端也是block模式吗?如果是的话
客户端ClientSocket去connect,成功后connect才会返回,这时候服务器
的TServerClientThread线程会被创建,TServerClientThread的execute是你自己实现,里面应该就是用TWinSocketStream接收数据。
在线程外部(“客户端也使用了一个线程”),你引用ClientSocket的Socket
我觉得这个Socket就是新建立起来的那个,你发送数据还是应该会被TWinSocketStream接收倒(服务器不会另外创建线程),你可以查看
clientsocket的socket信息,或者在服务器端设置断点。我不是很明白你的意思,只能帮到这了。
另外,如果你要发送文件为什么一定要放在线程外部?

解决方案 »

  1.   

    是这样,都是block模式。我的客户端也使用了一个线程,我的意思是,我和服务端联系,是在线程处理。发送文件的过程是这样:我在客户断发请求,服务端TServerClientThread读文件,并分批发给我的客户端,我的客户端线程使用TWinSocketStream接受之。
    我问的就是,我在客户断发请求,是用ClientSocket1.Socket.SendBuf(buffer, sizeof(databuffer))吗?不然应改如何做呢?
    感谢你的回答,不管解决与否,定然给分。
      

  2.   

    感觉你的理解是客户端只能接收不能发送,其实是同样的。
    在现线程的执行过程中是可以做这两件事情的。
    客户端线程类
    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;
    不知我理解的对不对
      

  3.   

    客户端线程使用TWinSocketStream接受之
      

  4.   

    to chenjbjbjb(哈哈) :
    我知道客户端当然可以接收,发送。但是,请注意:你贴的
    Try
          MySocket.Connect;//连接成功后会返回,失败则处理  Except
          MySocket.Socket.SendText(sRequestStr)//发送请求
    在循环外面,而且是Execute的里面的处理。之后进入与服务端交互。这样一来,我的客户端主线程需要发数据时该怎么办?我正注意听,请继续指教!
      

  5.   

    我的意思是想,一个请求一个应答一次连接。
    MySocket对象会随着连接的消失而释放。我的客户端主线程需要发数据时该怎么办
    ----
    那就在创建一个连接,让server新开一个线程为这个连接(请求)服务另外如果你有需求一定要在两个不同线程中用同一个Socket,我觉得你还得说的更具体一点。
      

  6.   

    TO  chenjbjbjb(哈哈) :
    一个请求一个应答一次连接?这可不行,因为存在这种需求:有时在客户端未请求时,服务端也会给客户端发信息。连接是不能断的。关键就是客户端主线程如何参与客户端工作线程与服务端的交互。我现在考滤这样处理:
    建立一个请求队列,给线程书写发送请求队列中的请求的过程,SendRequest,然后如下循环,当主线程有请求时,将请求加入队列,当服务端主动有数据发过来时,也可在线程中通过ReceiveData(TheStream);接受 。 
      while (not Terminated) and (Form1.ClientSocket1.Active) do
        begin
          SendRequest; //发送请求队列中的请求
          ReceiveData(TheStream); //接受数据
        end;
    不知是否妥当?请大家讨论。谢谢,都会有分。
      

  7.   

    可以用Winsock.Select来查看是否read/write信息,
    具体怎么做我也忘了。:(
    while (not Terminated) and (Form1.ClientSocket1.Active) do
    begin
      winsock.Select(...);
      case .. of 
        Write:  SendRequest; //发送请求队列中的请求
        Read:  ReceiveData(TheStream); //接受数据
      end;
    end;