socket傳送文件的問題(100分)

  • 主题发起人 主题发起人 takdick
  • 开始时间 开始时间
T

takdick

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用socket傳送文件,但不知何故,接收的文件只有4k,請幫我看看以下的代碼有何問題.
接收端:
fs3:=TFileStream.Create('c:/test2.exe',fmcreate);
fs3.Position:=0;
procedure TForm1.cs3Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
cs3.socket.SendText('go~');
end;
procedure TForm1.cs3Read(Sender: TObject; Socket: TCustomWinSocket);
var
stt3 : string;
buf3 : pointer;
lh3:integer;
begin
lh3:=Socket.ReceiveLength;
GetMem(buf3,lh3);
Socket.ReceiveBuf(buf3^,lh3);
stt3:=StrPas(PChar(buf3));
stt3:=Copy(stt3,1,lh3);
fs3.WriteBuffer(buf3^,lh3);
cs3.Socket.SendText('go~');
FreeMem(buf3,lh3);
end;

發送端:
fs:=tfilestream.Create('c:/test.exe',fmopenread);
fs.Position:=0;
procedure TForm1.ss2ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
buf2:pointer;
stt2:string;
begin
stt2:=socket.ReceiveText;
if stt2='go~' then
begin
if fs.Position< fs.Size then
begin
count:=fs.Size-fs.Position;
if count>4096 then count:=4096;
GetMem(buf2,count);
fs.Read(buf2^,count);
ss2.Socket.Connections[0].SendBuf(buf2^,count);
FreeMem(buf2,count);
end
else
begin
ss2.Socket.Connections[0].SendText('ok~');
fs.Free;
socket.Close;
end;
end;
end;
 
老兄,TFileStream是什么控件,我这里怎么没有?
没办法演示啊
 
{ 这个函数需要响应接收到'go~'才能连续发送,否则只发一次啊 }
procedure TForm1.ss2ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
buf2:pointer;
stt2:string;
begin
stt2:=socket.ReceiveText;
if stt2='go~' then
begin
if fs.Position< fs.Size then
begin
count:=fs.Size-fs.Position;
if count>4096 then count:=4096;
GetMem(buf2,count);
fs.Read(buf2^,count);
ss2.Socket.Connections[0].SendBuf(buf2^,count);
FreeMem(buf2,count);
end
else
begin
ss2.Socket.Connections[0].SendText('ok~');
fs.Free;
socket.Close;
end;
end;
 
var
fs:TFilestream;
begin
fs=TFilestream.create(filename,fmcreate);
TFilestream不是控件,而是delphi的一類型,看來你比我還菜,但謝謝你的幫忙.
我的接收端每接收完一次後有立即發放送'go~'呀.
fs3.WriteBuffer(buf3^,lh3);
cs3.Socket.SendText('go~');
 
接收端
procedure TForm1.cs3Read(Sender: TObject; Socket: TCustomWinSocket);

cs3.Socket.SendText('go~');
===改成 Socket.SendText('go~');
 
用阻塞方式来发.
 
謝謝兩位的幫忙,你們的方法我都試過,但都沒用.
另外我發現只要在發送端使用clientsocket,在接收端使用serversocket,就可以正常接收文件,但我卻需要掉換使用,問題出在哪裡呢?
 
调换不也是一样的吗?]
D
 
我也正奇怪呢.
我是用一組socket實現上傳和下載文件的功能,client端和server端的接收代碼都一樣.
但事實是只能完成下載,而上傳的文件只有4k就停止了,請再幫我看一下,有何問題.
完整代碼如下:
var
buf2:pointer;
stt2:string;
lh2:integer;
begin
lh2:=Socket.ReceiveLength;
GetMem(buf2,lh2);
Socket.ReceiveBuf(buf2^,lh2);
stt2:=StrPas(PChar(buf2));
stt2:=Copy(stt2,1,lh2);
if (updown=false) and (stt2<>'ok~') then //updown是用來標識下載或上傳
begin
fs.WriteBuffer(buf2^,lh2);
Socket.SendText('go~');
FreeMem(buf2,lh2);
exit;
end;
if stt2='go~' then
begin
if fs.Position< fs.Size then
begin
count:=fs.Size-fs.Position;
if count>4096 then count:=4096;
GetMem(buf2,count);
fs.Read(buf2^,count);
Socket.SendBuf(buf2^,count);
FreeMem(buf2,count);
end
else
begin
Socket.SendText('ok~');
fs.Free;
socket.Close;
end;
end;
if stt2='ok~' then
fs.Free;
 
4k是一个包啊,哎~~
 
什麼意思?我知道4k是一個包呀,但為什麼只發送了第一個包就沒能繼續下去呢??
請說得詳細點.
 
我做过
这样:
服务器用线程阻塞方式。这样就可以了。
 
我試過,但程序當掉了.
 
我現在發現只要用一組socket實現上傳或下載的功能就沒有問題.
但要用一組socket實現上傳和下載就會出現上述的情況,可以下載,但上傳的文件只能收到4k,就沒法繼續,問題到底在哪裡呢?
有誰能幫我測試一下嗎?
不勝感激!!!
 
很感兴趣,帮你试试!
 
delphi自带的demo有这样的一个例子(在integer文件夹),自己找出来看看就知道了
 
服务器用线程阻塞方式。这样就可以了。

----------------
我已经说得很清楚了.没人听?
 
TO:QSmile
我說過:我試過服務器用線程阻塞方式,但程序當掉了.
 
那就是你的用方不太对了。

要在SocketServer 的 GetThread 里写代码。我是这样做的。我的系统已经开始试运行了。
 
我很菜的,能否請你詳細地指點一下呢?
就我上述的情況,在SocketServer 的 GetThread 應該加什麼代碼?
 
后退
顶部