Delphi编写Socket通信程序问题?
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp, Menus;type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
ClientSocket1: TClientSocket;
listenitem1: TMenuItem;
connectitem1: TMenuItem;
disconnect1: TMenuItem;
exit1: TMenuItem;
ServerSocket1: TServerSocket;
Memo1: TMemo;
Memo2: TMemo;
procedure listenitem1Click(Sender: TObject);
procedure connectitem1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.listenitem1Click(Sender: TObject);
begin
listenitem1.Checked:=not listenitem1.Checked;
if listenitem1.Checked then
begin
clientsocket1.Active:=false;
serversocket1.Active:=true;
end
else
begin
if serversocket1.Active then
serversocket1.Active :=false;
end;
end;end.要用name不是用caption这个是别人告诉我的,不然出错,写了要申明我不会,会的不小气,帮我改那句说声。menu没有checked属性这是怎么回事?在发个原创的。利用Delphi编写Socket通信程序。
下面是一个简单的Socket通信程序,其中客户机和服务机是同一个程序,当客户机(服务器)在一个memo1中输入一段文字然后敲入回车,该段文字就可以显示在服务器(客户机)的memo2中,反之亦成立。具体步骤如下:
1、新建一个form,任意命名,不妨设之为chatForm;放上一个MainMenu(在Standard栏中),建立ListenItem、ConnectItem、Disconnect和Exit菜单项;在从Internet栏中选择TServerSocket、TClientSocket添加到chatForm中,其中把TClientSocket的名字设为ClientSocket, port设为1025,默认的active为false;把TServerSocket的名字设为ServerSocket,port设为1025,默认的active为false,其他的不变;再放入两个memo,一个命名为memo1,另外一个命名为memo2,其中把memo2的color设置为灰色,因为主要用来显示对方的输入。下面我们一边编写代码一边解释原因。
2、双击ListemItem。写入如下代码:
procedure TChatForm.ListenItemClick(Sender: TObject);
begin
ListenItem.Checked := not ListenItem.Checked;
if ListenItem.Checked then
begin
ClientSocket.Active := False;
ServerSocket.Active := True;
end
else
begin
if ServerSocket.Active then
ServerSocket.Active := False;
end;
end;
ListenItem.Checked := not ListenItem.Checked;和listenitem1.Checked:=not listenitem1.Checked;不一样为什么。不然一开始就错。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp, Menus;type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
ClientSocket1: TClientSocket;
listenitem1: TMenuItem;
connectitem1: TMenuItem;
disconnect1: TMenuItem;
exit1: TMenuItem;
ServerSocket1: TServerSocket;
Memo1: TMemo;
Memo2: TMemo;
procedure listenitem1Click(Sender: TObject);
procedure connectitem1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.listenitem1Click(Sender: TObject);
begin
listenitem1.Checked:=not listenitem1.Checked;
if listenitem1.Checked then
begin
clientsocket1.Active:=false;
serversocket1.Active:=true;
end
else
begin
if serversocket1.Active then
serversocket1.Active :=false;
end;
end;end.要用name不是用caption这个是别人告诉我的,不然出错,写了要申明我不会,会的不小气,帮我改那句说声。menu没有checked属性这是怎么回事?在发个原创的。利用Delphi编写Socket通信程序。
下面是一个简单的Socket通信程序,其中客户机和服务机是同一个程序,当客户机(服务器)在一个memo1中输入一段文字然后敲入回车,该段文字就可以显示在服务器(客户机)的memo2中,反之亦成立。具体步骤如下:
1、新建一个form,任意命名,不妨设之为chatForm;放上一个MainMenu(在Standard栏中),建立ListenItem、ConnectItem、Disconnect和Exit菜单项;在从Internet栏中选择TServerSocket、TClientSocket添加到chatForm中,其中把TClientSocket的名字设为ClientSocket, port设为1025,默认的active为false;把TServerSocket的名字设为ServerSocket,port设为1025,默认的active为false,其他的不变;再放入两个memo,一个命名为memo1,另外一个命名为memo2,其中把memo2的color设置为灰色,因为主要用来显示对方的输入。下面我们一边编写代码一边解释原因。
2、双击ListemItem。写入如下代码:
procedure TChatForm.ListenItemClick(Sender: TObject);
begin
ListenItem.Checked := not ListenItem.Checked;
if ListenItem.Checked then
begin
ClientSocket.Active := False;
ServerSocket.Active := True;
end
else
begin
if ServerSocket.Active then
ServerSocket.Active := False;
end;
end;
ListenItem.Checked := not ListenItem.Checked;和listenitem1.Checked:=not listenitem1.Checked;不一样为什么。不然一开始就错。
客户端:Function TForm1.ConnectionServer(const Server:string):Boolean;
begin
if SClient.Active then
SClient.Active:=false;
SClient.Port:= CPort;
SClient.Host:=Server;
try
SClient.Active:=true;
result:=true;
except
Showmessage('连接服务器失败!');
result:=false;
end;
end;function TForm1.GetFileSize(Const FileName:String):integer;
var
FileS:TFileStream;
begin
FileS:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone);
result:=Files.Size;
Files.Free;
end;procedure TForm1.SendFile;
var
Sendsize:integer;
buf:array [0..Buffersize] of char ;
begin
if FFileStream.Size < 1 then
LoadSendFile;
if SFlagSize >= BufferSize then
Sendsize := BufferSize
else
SendSize := SFlagSize;
// getmem(Buf,BufferSize);
FFileStream.ReadBuffer(Buf,Sendsize);
SFlagSize:=SFlagSize - SendSize;
if SFlagSize = 0 then
begin
FFileStream.Clear;
mmstatus.Lines.Add('文件传送完毕!');
end;
Try
SClient.Socket.SendBuf(buf,SendSize);
Except
FFileStream.Clear;
mmstatus.Lines.Add('传送文件错误!');
end;
end;Procedure TForm1.LoadSendFile;
begin
with FFileStream do
begin
Clear;
LoadFromFile(FFileName);
Position:=0;
SFlagSize:=Size;
end;
// Leavings
end;Procedure TForm1.StarSend;
var
FlagStr:String;
begin
With TOpenDialog.Create(nil) do
begin
if Execute then
begin
Flagstr:='SendFileinfo;'+ExtractFileName(Filename)+';'+Inttostr(GetFileSize(Filename));
FFileName:=FileName;
SClient.Socket.SendText(FlagStr);
mmStatus.Lines.Add(FlagStr);
mmstatus.Lines.Add('准备传送');
end;
end;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SClient.Active:=false;
SClient.Close;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
FFileStream := TMemoryStream.Create;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
FFileStream.Free;
end;procedure TForm1.SClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
Showmessage('连接成功!!');
end;procedure TForm1.SClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
FFileStream.Clear;
end;procedure TForm1.SClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
receiveS:string;
begin
ReceiveS:=Socket.ReceiveText;
mmStatus.Lines.Add(ReceiveS);
if ReceiveS = 'FiletransferWork' then
begin
SendFile;
end;
if ReceiveS = 'FileTransferStop' then
begin
FFileStream.Clear;
FFileStream.SetSize(0);
end;
end;procedure TForm1.BtnConnClick(Sender: TObject);
begin
self.ConnectionServer(EDIPAddr.Text);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
self.StarSend;
end;
服务端:Procedure TFrmServerFile.ConneRun;
begin
Trancing:=false;
SServer.Port:=CPort;
SServer.Active:=true;
MemoStream.Clear;
showmessage('服务器已经启动!');
end;procedure TFrmServerFile.StopConn;
begin
MemoStream.clear;
Trancing:=false;
if SServer.Socket.ActiveConnections>0 then
begin
SServer.Socket.Connections[0].SendText('FileTransferStop');
MmStatus.Lines.Add('当前任务停止!');
end;
end;Procedure TFrmServerFile.StartConn;
begin
if SServer.Socket.ActiveConnections>0 then
begin
Caption:='start';
MemoStream.Clear;
Trancing:=true;
SServer.Socket.Connections[0].SendText('FiletransferWork');
MmStatus.Lines.Add('准备好接受文件!');
end;
end;
procedure TFrmServerFile.FormCreate(Sender: TObject);
begin
MemoStream:=TMemoryStream.Create;
MemoStream.Position:=0;
ConneRun;
end;procedure TFrmServerFile.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SServer.Active:=False;
SServer.Close;
end;procedure TFrmServerFile.SServerAccept(Sender: TObject; Socket: TCustomWinSocket);
begin
mmStatus.Lines.Add('客户:'+Socket.RemoteHost+'连接成功!')
end;procedure TFrmServerFile.SServerClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
DataF:PDataFlag;
begin
DataF := New(pDataFlag);
Dataf.FileName:='';
Dataf.FileSize:=0;
DataF.WorkFlag:=0;
Socket.Data:=Dataf;
socket.SendText('已经连接好,准备传输文件!'#13#10);
// socket.RemoteHost+' '
end;procedure TFrmServerFile.SServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
Buf:array[0..buffersize] of char;
dataf:PDataFlag;
NumberBytes:integer;
cmd:string;
begin
dataf:=Socket.Data;
Case dataf.WorkFlag of
0:
begin
cmd := Trim(Socket.ReceiveText);
if pos('SendFileinfo',cmd) > 0 then
begin
DataF.FileName:=Trim(Copy(CMD,pos(';',cmd)+1,Length(cmd)));
Dataf.FileSize:=StrToInt(Copy(Dataf.FileName,pos(';',Dataf.FileName)+1,Length(dataf.FileName)));
DataF.FileName:=Trim(copy(Dataf.FileName,0,pos(';',dataf.FileName)-1));
Dataf.WorkFlag:=1;
socket.Data:=Dataf;
mmStatus.Lines.Add('文件名:'+dataf.FileName+'文件大小:'+inttostr(Dataf.FileSize));
userhost :=Socket.RemoteHost;
end;
end;
1:
begin
if Trancing then
begin
begin
NumberBytes:= socket.ReceiveLength;
socket.ReceiveBuf(buf,NumberBytes);
MemoStream.Write(buf,numberBytes);
if numberbytes >= BufferSize then
begin
socket.SendText('FiletransferWork');
mmstatus.Lines.Add(inttostr(NumberBytes));
end;
if numberbytes < BufferSize then
begin
socket.Sendtext('FileTransferStop');
MemoStream.Position:=0;
try
mmstatus.Lines.Add('来自:'+Socket.RemoteHost+ '的文件传送完毕!');
Trancing:=false;
Dataf.WorkFlag:=0;
socket.Data:=Dataf;
MemoStream.savetofile(DataF.filename);
except
showmessage('在保存文件时出现错误!');
exit;
end;
Memostream.clear;
end;
end;
end;
end;
end;
end;procedure TFrmServerFile.BtnStartClick(Sender: TObject);
begin
StartConn;
end;procedure TFrmServerFile.BtnStopClick(Sender: TObject);
begin
stopconn;
end;procedure TFrmServerFile.BtnDisConneClick(Sender: TObject);
begin
SServer.Socket.SendText('我要断开了!');
SServer.Active:=False;
end;procedure TFrmServerFile.BtnCloseClick(Sender: TObject);
begin
Close;
end;
http://www.ahjoe.com/source/srcdown.asp