关于UDP问题啊高手快来给100分(100分)

  • 主题发起人 wyismail
  • 开始时间
W

wyismail

Unregistered / Unconfirmed
GUEST, unregistred user!
我用UDP和TMEMORYSTREAM在局网上传输图片以下代码老调试不通请帮忙
CLIENT
procedure TForm1.Button1Click(Sender: TObject);
var ms:TMemoryStream;
begin
self.NMUDPClient.RemoteHost:='127.0.0.1';
self.NMUDPClient.RemotePort:=6767;
self.NMUDPClient.ReportLevel:=Status_Basic;


try
MS:=TMemoryStream.Create;

Image1.Picture.Bitmap.SaveToStream(MS);
ms.Position:=0;
NMUDPClient.SendStream(MS);
finally
ms.Free;
end;
end;

SERVER

procedure TForm2.NMUDPServerDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var MyStream: TMemoryStream;
begin

NMUDPServer.ReadStream(MyStream);
MyStream.Position:=0;
Image1.Picture.Bitmap.LoadFromStream(MyStream);

update;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
SELF.NMUDPServer.RemotePort:=6767;
self.NMUDPServer.ReportLevel:=Status_Basic;
end;

 
你要控制每次发送的数据包的大小,每次发送的数据量最好小于2k,如果文件比较大,
需要分几次传输,这样,需要自定义一个文件传输协议,当服务器接收到一包数据后,返回确认信号
到客户端,客户端接着传送下一包数据。
另外,在测试时,在服务器端最好先保存为文件,确认网络传输没有问题时,再实时显示。
 
procedure TForm2.NMUDPServerDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var MyStream: TMemoryStream;
begin
Mystream:=TMemoryStream.Create;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NMUDPServer.ReadStream(MyStream);
MyStream.Position:=0;
Image1.Picture.Bitmap.LoadFromStream(MyStream);
Mystream.free;
~~~~~~~~~~~~~~~~~~~~~
update;
end;
 
这样不行。在客户端先确定流的大小,发送一个流的大小的数据给服务端,让服务端知道流的大小。再循环接收并合并流的大小。直到等于或大小原流大小为止。在显示出来。包没问题。我写过一个远程截屏的软件就是这样的。
 
要么用TCP协议做,会自动帮你同步客户端和服务器端的传输。
用UDP的话,要自己实现协议,即客户端和服务器端需要编程实现同步。
比如客户端送数据后等待服务器端确认后再继续发送。
 
每次2K,要编号!
帮你UP!
 
接受答案了.
 
玩转分游戏真是没意思!!!!!!!!!!
 
顶部