服务器:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, Jpeg;type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
procedure FormCreate(Sender: TObject);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
m1:tmemorystream;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Open;
end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
filename:string; //ini 文件路径
s,s1:string;
// desk:tcanvas;
bitmap:tbitmap;
jpg:tjpegimage;
buffer:array of byte;
len:longint;
begin
s:=socket.ReceiveText;
if s='gets' then //客户端发出申请
begin
filename:=ExtractFilePath(paramstr(0))+'2.bmp';
bitmap:=tbitmap.Create;
jpg:=tjpegimage.Create;
m1:=tmemorystream.Create;
bitmap.LoadFromFile(filename);
jpg.Assign(bitmap); //将图象转成JPG格式
jpg.SaveToStream(m1); //将JPG图象写入流中
jpg.free;
m1.Position:=0;
s1:=inttostr(m1.size);
Socket.sendtext(s1); //发送图象大小
end;
if s='okok' then //客户端已准备好接收图象
begin
m1.Position:=0;
Socket.SendStream(m1); //发送JPG图象
end;end;end.
这个程序可以把图片发送到客户端
但是:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, Jpeg;type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
procedure FormCreate(Sender: TObject);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
m1:tmemorystream;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Open;
end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
filename:string; //ini 文件路径
s,s1:string;
// desk:tcanvas;
bitmap:tbitmap;
jpg:tjpegimage;
buffer:array of byte;
len:longint;
begin
s:=socket.ReceiveText;
if s='gets' then //客户端发出申请
begin
filename:=ExtractFilePath(paramstr(0))+'2.bmp';
bitmap:=tbitmap.Create;
jpg:=tjpegimage.Create;
m1:=tmemorystream.Create;
bitmap.LoadFromFile(filename);
jpg.Assign(bitmap); //将图象转成JPG格式
jpg.SaveToStream(m1); //将JPG图象写入流中
jpg.free;
m1.Position:=0;
s1:=inttostr(m1.size);
Socket.sendtext(s1); //发送图象大小
end;
if s='okok' then //客户端已准备好接收图象
begin
len:=m1.Size;
setlength(buffer,len);
m1.Position:=0;
m1.Write(buffer[0],len);
Socket.SendBuf(buffer[0],len);
end;end;end.但是这个就不行
客户端的程序是:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp, ExtCtrls, Jpeg;type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
Button1: TButton;
Edit1: TEdit;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
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
clientsocket1.Socket.SendText('gets');
end;procedure TForm1.FormCreate(Sender: TObject);
begin
m:=tmemorystream.Create;
ClientSocket1.Open;
end;procedure TForm1.ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
edit1.Text:='连接到服务器';
end;procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
edit1.Text:='连接失败';
errorcode:=0;
end;procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
buffer:array [0..10000] of byte; //设置接收缓冲区
len:integer;
ll:string;
b:tbitmap;
j:tjpegimage;
begin
if c=0 then //C为服务端发送的字节数,如果为0表示为尚未开始图象接收
begin
ll:=socket.ReceiveText;
c:=strtoint(ll); //设置需接收的字节数
clientsocket1.Socket.SendText('okok'); //通知服务端开始发送图象
end else
begin //以下为图象数据接收部分
len:=socket.ReceiveLength; //读出包长度
socket.ReceiveBuf(buffer,len); //接收数据包并读入缓冲区内
m.Write(buffer,len); //追加入流M中
if m.Size>=c then //如果流长度大于需接收的字节数,则接收完毕
begin
m.Position:=0;
b:=tbitmap.Create;
j:=tjpegimage.Create;
try
j.LoadFromStream(m); //将流M中的数据读至JPG图像对象J中
b.Assign(j); //将JPG转为BMP
Image1.Picture.Bitmap.Assign(b); //分配给image1元件
finally //以下为清除工作
b.free;
j.free;
clientsocket1.Active:=false;
clientsocket1.Active:=true;
m.Clear;
c:=0;
end;
end;
end;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
m.free;
ClientSocket1.Close;
end;end.各位大哥:
服务器端的
len:=m1.Size;
setlength(buffer,len);
m1.Position:=0;
m1.Write(buffer[0],len);
Socket.SendBuf(buffer[0],len);错在哪里?谢谢!
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, Jpeg;type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
procedure FormCreate(Sender: TObject);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
m1:tmemorystream;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Open;
end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
filename:string; //ini 文件路径
s,s1:string;
// desk:tcanvas;
bitmap:tbitmap;
jpg:tjpegimage;
buffer:array of byte;
len:longint;
begin
s:=socket.ReceiveText;
if s='gets' then //客户端发出申请
begin
filename:=ExtractFilePath(paramstr(0))+'2.bmp';
bitmap:=tbitmap.Create;
jpg:=tjpegimage.Create;
m1:=tmemorystream.Create;
bitmap.LoadFromFile(filename);
jpg.Assign(bitmap); //将图象转成JPG格式
jpg.SaveToStream(m1); //将JPG图象写入流中
jpg.free;
m1.Position:=0;
s1:=inttostr(m1.size);
Socket.sendtext(s1); //发送图象大小
end;
if s='okok' then //客户端已准备好接收图象
begin
m1.Position:=0;
Socket.SendStream(m1); //发送JPG图象
end;end;end.
这个程序可以把图片发送到客户端
但是:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, Jpeg;type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
procedure FormCreate(Sender: TObject);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
m1:tmemorystream;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Open;
end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
filename:string; //ini 文件路径
s,s1:string;
// desk:tcanvas;
bitmap:tbitmap;
jpg:tjpegimage;
buffer:array of byte;
len:longint;
begin
s:=socket.ReceiveText;
if s='gets' then //客户端发出申请
begin
filename:=ExtractFilePath(paramstr(0))+'2.bmp';
bitmap:=tbitmap.Create;
jpg:=tjpegimage.Create;
m1:=tmemorystream.Create;
bitmap.LoadFromFile(filename);
jpg.Assign(bitmap); //将图象转成JPG格式
jpg.SaveToStream(m1); //将JPG图象写入流中
jpg.free;
m1.Position:=0;
s1:=inttostr(m1.size);
Socket.sendtext(s1); //发送图象大小
end;
if s='okok' then //客户端已准备好接收图象
begin
len:=m1.Size;
setlength(buffer,len);
m1.Position:=0;
m1.Write(buffer[0],len);
Socket.SendBuf(buffer[0],len);
end;end;end.但是这个就不行
客户端的程序是:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp, ExtCtrls, Jpeg;type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
Button1: TButton;
Edit1: TEdit;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
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
clientsocket1.Socket.SendText('gets');
end;procedure TForm1.FormCreate(Sender: TObject);
begin
m:=tmemorystream.Create;
ClientSocket1.Open;
end;procedure TForm1.ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
edit1.Text:='连接到服务器';
end;procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
edit1.Text:='连接失败';
errorcode:=0;
end;procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
buffer:array [0..10000] of byte; //设置接收缓冲区
len:integer;
ll:string;
b:tbitmap;
j:tjpegimage;
begin
if c=0 then //C为服务端发送的字节数,如果为0表示为尚未开始图象接收
begin
ll:=socket.ReceiveText;
c:=strtoint(ll); //设置需接收的字节数
clientsocket1.Socket.SendText('okok'); //通知服务端开始发送图象
end else
begin //以下为图象数据接收部分
len:=socket.ReceiveLength; //读出包长度
socket.ReceiveBuf(buffer,len); //接收数据包并读入缓冲区内
m.Write(buffer,len); //追加入流M中
if m.Size>=c then //如果流长度大于需接收的字节数,则接收完毕
begin
m.Position:=0;
b:=tbitmap.Create;
j:=tjpegimage.Create;
try
j.LoadFromStream(m); //将流M中的数据读至JPG图像对象J中
b.Assign(j); //将JPG转为BMP
Image1.Picture.Bitmap.Assign(b); //分配给image1元件
finally //以下为清除工作
b.free;
j.free;
clientsocket1.Active:=false;
clientsocket1.Active:=true;
m.Clear;
c:=0;
end;
end;
end;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
m.free;
ClientSocket1.Close;
end;end.各位大哥:
服务器端的
len:=m1.Size;
setlength(buffer,len);
m1.Position:=0;
m1.Write(buffer[0],len);
Socket.SendBuf(buffer[0],len);错在哪里?谢谢!
谢谢!