如何用SERVERSOCKET和CLIENTSOCKET收发流。(200分)

  • 主题发起人 主题发起人 小虫子:P
  • 开始时间 开始时间

小虫子:P

Unregistered / Unconfirmed
GUEST, unregistred user!
用ACMWAVEIN控件得到了声音放在一个流里,然后用CLIENTSOCKET发到SERVERSOCKET,
SERVERSOCKET再把得到的东西发给每个CLIENT,CLIENT收到后给ACMWAVEOUT播放出来。

不知道我说明白没,谁能给出完整的程序?
多谢。
 
思路你都有了,自己写啊,很简单,有问题再说啦
 
但是我不会呀,我刚接触TCPIP编程,老板又催的急。
 
用控件的sendbuf和ReceiveBuf函数啊,或者看一下delphi自带的demo
 
RECEIVEBUF不是返回一个INTEGER吗?怎么用?
 
sendbuf和ReceiveBuf都是返回一个integer,就是发送或接收到数据的长度(字节数),如果
返回值<=0,说明有错误发生。
 
给个例子吧,分不够再加?
 
procedure TForm1.ClientSocket2Read(Sender: TObject;
Socket: TCustomWinSocket);
var len:integer;
temp:string;
begin
if stStatue=stgetFile then
begin
Len:=Socket.ReceiveLength;
Temp:=Socket.ReceiveText;
filem.Write(PChar(Temp)^,len); //filem是一个文件流
inc(allLen,len);
if allLen=getfilesize then //allLen是文件长度,你先传送过来
ShowMessage('文件接受完毕!');
end;

发送部分
const
MAX_LEN=2048;

var
iSen:integer; //iSen发送出去的长度
iSize:integer; //文件长度 最好是全局变量
buf:array[1..MAXLEN]of char;
senlen:integer; //每次应该发送的长度
ret:integer; //实际发送的文件长度
filen:TFileStream; //最好是全局变量

iSen:=0;
while iSen<iSize do
begin
FillChar(buf,MAX_LEN,0);
if iSize-iSen>MAX_LEN then senlen:=MAX_LEN
else senLen:=iSize-iSen;
filen.Position:=iSen;
filen.Read(buf,senLen);
ret:=ClientSocket1.Socket.SendBuf(buf,senLen);
inc(iSen,ret);
end;
 
Len:=Socket.ReceiveLength;
其实错误不用你处理,Delphi的OnError事件 处理了这个错误,
 
我发送的不是文件呀,是用ACMWAVEIN的ONDATA事件的到的一个流。
procedure TForm2.ACMWaveIn1Data(data: Pointer; size: Integer);
var a:tmemorystream;
begin
a:=tmemorystream.Create ;
a.Write(data^,size);
idudpclient1.SendBuffer(data^,size);//用的是UDP我想改成用CLIENTSOCKET,
a.free;
end;

 
例子:

procedure TMyClientThread.Execute;

var
TheStream: TWinSocketStream;
buffer: string;
begin
{ create a TWinSocketStream for reading and writing }
TheStream := TWinSocketStream.Create(ClientSocket1.Socket, 60000);
try
{ fetch and process commands until the connection or thread is terminated }
while (not Terminated) and (ClientSocket1.Active) do
begin
try
GetNextRequest(buffer); { GetNextRequest must be a thread-safe method }

{ write the request to the server }
TheStream.Write(buffer, Length(buffer) + 1);
{ continue the communication (eg read a response from the server) }
...
except
ifnot(ExceptObject is EAbort) then
Synchronize(HandleThreadException); { you must write HandleThreadException }
end;
end;
finally
TheStream.Free;
end;
end;
 
看不懂。
 
我的FileStream就是一个流,你稍微修改就可以用了!
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
911
DelphiTeacher的专栏
D
D
回复
0
查看
868
DelphiTeacher的专栏
D
D
回复
0
查看
840
DelphiTeacher的专栏
D
D
回复
0
查看
825
DelphiTeacher的专栏
D
后退
顶部