关于ServerSocket, ClientSocket的问题 在EXAMPLES - internet - chat目录有一个CHAT程序,可以用来发送接受文本。稍加改动(用SendBuf代替SendText)就可以。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 简单的做法如上所述,将TBITMAP,SAVETOSTREAM,再用SENDSTREAM把它发出去即可,但实际上会有问题。我在公司写的一个程序里是用WINSOCK做阻塞式TCP传输,自已打的数据包,256B一包,效果很好,但因为公司对SOURCE管得严,所以这里没办法给你了。 一点建议: 发送图像时,每个数据包不可超过 4k, 否则不论 Sendbuf, sendText 都会有不可预料的问题。 最好自己有应答,否则大数据,很容易错包。 其实大于4K也可以,就是发送后要SLEEP(500)以上才行; 有CODE 请发给我一份 [email protected] 客户端程序unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,JPEG, ExtCtrls, ScktComp;type TForm1 = class(TForm) ServerSocket1: TServerSocket; procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end;var Form1: TForm1; m1:tmemorystream; implementation{$R *.DFM}procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);var s,s1:string; desk:tcanvas; bitmap:tbitmap; jpg:tjpegimage;begin s:=socket.ReceiveText; if s='gets' then //file://客户端发出申请 begin try m1:=tmemorystream.Create; bitmap:=tbitmap.Create; jpg:=tjpegimage.Create; desk:=tcanvas.Create; //以下代码为取得当前屏幕图象 desk.Handle:=getdc(hwnd_desktop); with bitmap do begin width:=screen.Width; height:=screen.Height; canvas.CopyRect(canvas.cliprect,desk,desk.cliprect); end; jpg.Assign(bitmap); //file://将图象转成JPG格式 jpg.CompressionQuality:=10;//文件压缩大小设置 //m1.clear; jpg.SaveToStream(m1); //file://将JPG图象写入流中 jpg.free; m1.Position:=0; s1:=inttostr(m1.size); Socket.sendtext(s1); //file://发送图象大小 finally bitmap.free; desk.free; end; end; if s='okok' then //file://客户端已准备好接收图象 begin m1.Position:=0; Socket.SendStream(m1); //file://发送JPG图象 end;end;procedure TForm1.FormCreate(Sender: TObject);begin ServerSocket1.open;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin ServerSocket1.close;end;end.主机程序unit Unit2;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScktComp, ExtCtrls,jpeg;type TForm1 = class(TForm) ClientSocket1: TClientSocket; Edit1: TEdit; Button1: TButton; Button2: TButton; Image1: TImage; Label1: TLabel; procedure Button1Click(Sender: TObject); procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); procedure Button2Click(Sender: TObject); procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end;var Form1: TForm1; c:longint; m:tmemorystream;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);begin try clientsocket1.Close; clientsocket1.Host:=edit1.text; clientsocket1.Open; //file://连接服务端 except showmessage(edit1.text+#13#10+'未开机或未安装服务程序'); end;end;procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);begin showmessage('连接到'+edit1.text);end;procedure TForm1.Button2Click(Sender: TObject);begin if button2.enabled then begin clientsocket1.Socket.SendText('gets'); //file://发送申请,通知服务端需要屏幕图象 end;end;procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);begin caption:='连接'+edit1.text+'失败'; showmessage(edit1.text+#13#10+'未开机或未安装服务程序'); errorcode:=0;end;procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);var buffer:array [0..10000] of byte; //file://设置接收缓冲区 len:integer; ll:string; b:tbitmap; j:tjpegimage;begin if c=0 then //file://C为服务端发送的字节数,如果为0表示为尚未开始图象接收 begin ll:=socket.ReceiveText; c:=strtoint(ll); //file://设置需接收的字节数 clientsocket1.Socket.SendText('okok'); //file://通知服务端开始发送图象 end else begin //file://以下为图象数据接收部分 len:=socket.ReceiveLength; //file://读出包长度 label1.Caption:=inttostr(c); socket.ReceiveBuf(buffer,len); //file://接收数据包并读入缓冲区内 m.Write(buffer,len); //file://追加入流M中 if m.Size>=c then //file://如果流长度大于需接收的字节数,则接收完毕 begin m.Position:=0; b:=tbitmap.Create; j:=tjpegimage.Create; try j.LoadFromStream(m); //file://将流M中的数据读至JPG图像对象J中 b.Assign(j); //file://将JPG转为BMP Image1.Picture.Bitmap.Assign(b); //file://分配给image1元件 finally //file://以下为清除工作 b.free; j.free; clientsocket1.Active:=false; clientsocket1.Active:=true; m.Clear; c:=0; end; end; end;end;procedure TForm1.FormCreate(Sender: TObject);begin m:=tmemorystream.Create;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin m.free; ClientSocket1.Close;end;end. 请试试用:var Buf:TBitMap;Sendbuf(buf,sizeof(buf));如果不行的话可以试试使用文件流来传送。 delphi 改写 vc 函数 参数传递问题 關于權限管理 如何能让timage响应得到焦点和失去焦点的事件! 怎么样获得Access的表的字段名称?解决马上给分! 如何用语句在Tchart中动态加入Serie 各位有没有用过这种功能的控件呢? 在程序中如何等待一个打印任务结束?(见详细内容) 有关标题栏 怎样得到当前的年月日? 新手求助-Intraweb做网页用了HTML模板,如何让网页局部刷新? 听说本站为共享软件作者提供20M空间,如何得到? 窗口关闭的问题?
发送图像时,每个数据包不可超过 4k,
否则不论 Sendbuf, sendText 都会有不可预料的问题。
最好自己有应答,否则大数据,很容易错包。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,JPEG,
ExtCtrls, ScktComp;type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
m1:tmemorystream;
implementation{$R *.DFM}procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
s,s1:string;
desk:tcanvas;
bitmap:tbitmap;
jpg:tjpegimage;
begin
s:=socket.ReceiveText;
if s='gets' then //file://客户端发出申请
begin
try
m1:=tmemorystream.Create;
bitmap:=tbitmap.Create;
jpg:=tjpegimage.Create;
desk:=tcanvas.Create; //以下代码为取得当前屏幕图象
desk.Handle:=getdc(hwnd_desktop);
with bitmap do
begin
width:=screen.Width;
height:=screen.Height;
canvas.CopyRect(canvas.cliprect,desk,desk.cliprect);
end;
jpg.Assign(bitmap); //file://将图象转成JPG格式
jpg.CompressionQuality:=10;//文件压缩大小设置
//m1.clear;
jpg.SaveToStream(m1); //file://将JPG图象写入流中
jpg.free;
m1.Position:=0;
s1:=inttostr(m1.size);
Socket.sendtext(s1); //file://发送图象大小
finally
bitmap.free;
desk.free;
end;
end;
if s='okok' then //file://客户端已准备好接收图象
begin
m1.Position:=0;
Socket.SendStream(m1); //file://发送JPG图象
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.open;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket1.close;
end;end.主机程序
unit Unit2;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ScktComp, ExtCtrls,jpeg;type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
Image1: TImage;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button2Click(Sender: TObject);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
c:longint;
m:tmemorystream;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
begin
try
clientsocket1.Close;
clientsocket1.Host:=edit1.text;
clientsocket1.Open; //file://连接服务端
except
showmessage(edit1.text+#13#10+'未开机或未安装服务程序');
end;
end;procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
showmessage('连接到'+edit1.text);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
if button2.enabled then
begin
clientsocket1.Socket.SendText('gets'); //file://发送申请,通知服务端需要屏幕图象
end;
end;procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
caption:='连接'+edit1.text+'失败';
showmessage(edit1.text+#13#10+'未开机或未安装服务程序');
errorcode:=0;
end;procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
buffer:array [0..10000] of byte; //file://设置接收缓冲区
len:integer;
ll:string;
b:tbitmap;
j:tjpegimage;
begin
if c=0 then //file://C为服务端发送的字节数,如果为0表示为尚未开始图象接收
begin
ll:=socket.ReceiveText;
c:=strtoint(ll); //file://设置需接收的字节数
clientsocket1.Socket.SendText('okok'); //file://通知服务端开始发送图象
end else
begin //file://以下为图象数据接收部分
len:=socket.ReceiveLength; //file://读出包长度
label1.Caption:=inttostr(c);
socket.ReceiveBuf(buffer,len); //file://接收数据包并读入缓冲区内
m.Write(buffer,len); //file://追加入流M中
if m.Size>=c then //file://如果流长度大于需接收的字节数,则接收完毕
begin
m.Position:=0;
b:=tbitmap.Create;
j:=tjpegimage.Create;
try
j.LoadFromStream(m); //file://将流M中的数据读至JPG图像对象J中
b.Assign(j); //file://将JPG转为BMP
Image1.Picture.Bitmap.Assign(b); //file://分配给image1元件
finally //file://以下为清除工作
b.free;
j.free;
clientsocket1.Active:=false;
clientsocket1.Active:=true;
m.Clear;
c:=0;
end;
end;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
m:=tmemorystream.Create;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
m.free;
ClientSocket1.Close;
end;end.
var Buf:TBitMap;
Sendbuf(buf,sizeof(buf));
如果不行的话可以试试使用文件流来传送。