通过Socket传送流???ClientSocket And ServerSocket的用法(200分)

  • 主题发起人 主题发起人 魏启明
  • 开始时间 开始时间

魏启明

Unregistered / Unconfirmed
GUEST, unregistred user!
诸位请看我的代码
ServerSocket的发送
代码:
  MemoryStream.Position := 0;
  SS.Socket.Connections[0].SendStream(MemoryStream);

ClientSocket的接受
代码:
procedure TForm1.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
var
  RBuffer: array[0..10000] of byte; {设置接收缓冲区}
  RLength: integer;
begin
    RLength := socket.ReceiveLength; {读出包长度}
    Socket.ReceiveBuf(RBuffer, RLength); {接收数据包并读入缓冲区内}
    MStream.Write(RBuffer, RLength); {将数据写入流中}
    if MStream.Size >= MSize then {如果流长度大于需接收的字节数,则接收完毕}  
    //MSize 流的长度,事先由程序取得
    begin
      MStream.Position := 0;
      Image1.Picture.Bitmap.LoadFromStream(MStream);
      button2.Caption:=inttostr(MStream.Size);
//      MStream.Clear;
//      MSize := 0;
    end;
end;


这个代码,在网上看到很多,可是我的机子运行时就是会出错。
同时那个服务器端只要传过一次,就会出现地址错误,无法关闭。但是socket之间还可以响应(连接,断开)

编译环境Win2k,D7,“install packages——>选择Bin下的dclsockets70.bpl”安装的
ClientSocket And ServerSocket

流是内存流,流的内容的正确性是可以保证的,流的大小在1.4M左右,估计将来使用时,流大小在10M以内
 
看到SendStream里面的代码,是把流分割成大小4096字节的包发送的,就是说,应当不会出
现流长度变化的问题啊


期待有人能提供源码,谢谢了,

千恩万谢
 
我用的是无阻赛
 
最近好像老有人在网上问socket传数据的问题,我这有个几年前给一个朋友写的例子,你看对你有没有用处。
http://www.lkinfo.net/SocketData.rar
 
SS.Socket.Connections[0].SendStream(MemoryStream)﹔
上面這段代碼是用Socket發送流﹐確定在這段代碼后沒有寫類似MemoryStream.Free的代碼。否則就會出現地址錯誤。
原因是因為﹐當Socket發送一個流時﹐這個流的擁有者就變成了當前的Socket﹐當Socket被釋放時﹐這個流也會被釋放。
 
关 注 ,提前
 
我用D6的tserversocket / tclientsocket 控件,做一个TCP/IP的软件。

我的客户端是一个GPRS 终端,所以不用管它。可是,终端它可能有不可知的中断,比如突然断电等情况,所以这里就有一个问题:当终端不可知的中断的情况下,主站是肯定不知道的,而且,socket 连接的数组也不会减少的,也就是中断的SOCKET 套接字不能及时的删除,那么主站它会定时下达指令时,也会向这个已中断的SOCKET发指令,所以这时发关的指令是无法返回的。请问我要如何维护SOCKET 的CONNECTION[K],就是要删除数组中的某个数;

serversocket.socket.connection[k].close;
以上这句是用来关闭一个连接,但不是用来删除数组中的一个数;
 
你这种网络不稳定或连接不可靠的情况需要定义握手等规约的。
 
后退
顶部