Delphi TclientSocket跟TserverSocket用法(1)
Delphi TclientSocket和TserverSocket用法(1)unit uServerMaininterfaceusesWindows, Messages, SysUtils
Delphi TclientSocket和TserverSocket用法(1)
unit uServerMain;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ScktComp, ToolWin, ComCtrls, ExtCtrls, StdCtrls, Buttons;constCMax=10; //客户端最大连接数typeclient_record=recordCHandle: integer; //客户端套接字句柄CSocket:TCustomWinSocket; //客户端套接字CName:string; //客户端计算机名称CAddress:string; //客户端计算机IP地址CUsed: boolean; //客户端联机标志end;typeTfrmServerMain = class(TForm)ServerSocket: TServerSocket;ControlBar1: TControlBar;ToolBar1: TToolBar;tbConnect: TToolButton;tbClose: TToolButton;tbDisconnected: TToolButton;Edit1: TEdit;Memo1: TMemo;StatusBar: TStatusBar;procedure tbConnectClick(Sender: TObject);procedure tbDisconnectedClick(Sender: TObject);procedure ServerSocketClientRead(Sender: TObject;Socket: TCustomWinSocket);procedure ServerSocketListen(Sender: TObject;Socket: TCustomWinSocket);procedure ServerSocketClientConnect(Sender: TObject;Socket: TCustomWinSocket);procedure ServerSocketClientDisconnect(Sender: TObject;Socket: TCustomWinSocket);procedure tbCloseClick(Sender: TObject);procedure FormCreate(Sender: TObject);procedure FormClose(Sender: TObject; var Action: TCloseAction);procedure ServerSocketGetSocket(Sender: TObject; Socket: Integer;var ClientSocket: TServerClientWinSocket);procedure ServerSocketClientError(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer);private{ Private declarations }public{ Public declarations }session: array[0..CMax] of client_record; //客户端连接数组Sessions: integer; //客户端连接数end;varfrmServerMain: TfrmServerMain;implementation{$R *.DFM}//打开套接字连接,并使套接字进入监听状态procedure TfrmServerMain.tbConnectClick(Sender: TObject);beginServerSocket.Open ;end;//关闭套接字连接,不再监听客户端的请求procedure TfrmServerMain.tbDisconnectedClick(Sender: TObject);beginServerSocket.Close;StatusBar.Panels[0].Text :=服务器套接字连接已经关闭,无法接受客户端的连接请求.;end;//从客户端读取信息procedure TfrmServerMain.ServerSocketClientRead(Sender: TObject;Socket: TCustomWinSocket);vari:integer;begin//将从客户端读取的信息添加到Memo1中Memo1.Lines.Add(Socket.ReceiveText);for i:=0 to sessions dobegin//取得匹配的客户端if session[i].CHandle = Socket.SocketHandle thenbeginsession[i].CSocket.SendText(回复客户端+session[i].CAddress+ ==> +Edit1.Text);end;end;end;//服务器端套接字进入监听状态,以便监听客户端的连接procedure TfrmServerMain.ServerSocketListen(Sender: TObject;Socket: TCustomWinSocket);beginStatusBar.Panels[0].Text :=等待客户端连接...;end;//当客户端连接到服务器端以后procedure TfrmServerMain.ServerSocketClientConnect(Sender: TObject;Socket: TCustomWinSocket);vari,j:integer;beginj:=-1;for i:=0 to sessions dobegin//在原有的客户端连接数组中有中断的客户端连接if not session[i].CUsed thenbeginsession[i].CHandle := Socket.SocketHandle ;//客户端套接字句柄session[i].CSocket := Socket; //客户端套接字session[i].CName := Socket.RemoteHost ; //客户端计算机名称session[i].CAddress := Socket.RemoteAddress ;//客户端计算机IPsession[i].CUsed := True; //连接数组当前位置已经占用Break;end;j:=i;end;if j=sessions thenbegininc(sessions);session[j].CHandle := Socket.SocketHandle ;session[j].CSocket := Socket;session[j].CName := Socket.RemoteHost ;session[j].CAddress := Socket.RemoteAddress ;session[j].CUsed := True;end;StatusBar.Panels[0].Text := 客户端 +Socket.RemoteHost + 已经连接;end;//当客户端断开连接时procedure TfrmServerMain.ServerSocketClientDisconnect(Sender: TObject;Socket: TCustomWinSocket);vari:integer;beginfor i:=0 to sessions dobeginif session[i].CHandle =Socket.SocketHandle thenbeginsession[i].CHandle :=0;session[i].CUsed := False;Break;end;end;StatusBar.Panels[0].Text :=客户端 +Socket.RemoteHost + 已经断开;end;//关闭窗口procedure TfrmServerMain.tbCloseClick(Sender: TObject);beginClose;end;procedure TfrmServerMain.FormCreate(Sender: TObject);beginsessions := 0;end;procedure TfrmServerMain.FormClose(Sender: TObject;var Action: TCloseAction);beginServerSocket.Close ;end;//当客户端正在与服务器端连接时procedure TfrmServerMain.ServerSocketGetSocket(Sender: TObject;Socket: Integer; var ClientSocket: TServerClientWinSocket);beginStatusBar.Panels[0].Text :=客户端正在连接...;end;//客户端发生错误procedure TfrmServerMain.ServerSocketClientError(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer);beginStatusBar.Panels[0].Text :=客户端+Socket.RemoteHost +发生错误!;ErrorCode := 0;end;end.· 客户端源码(uClientMain.pas):
unit uClientMain;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ScktComp, ComCtrls, ToolWin, ExtCtrls, StdCtrls, Buttons;constSocketHost = 172.16.1.6; //服务器端地址typeTfrmClientMain = class(TForm)ControlBar1: TControlBar;ToolBar1: TToolBar;tbConnected: TToolButton;tbSend: TToolButton;tbClose: TToolButton;tbDisconnected: TToolButton;ClientSocket: TClientSocket;Edit1: TEdit;Memo1: TMemo;StatusBar: TStatusBar;btnSend: TBitBtn;procedure tbConnectedClick(Sender: TObject);procedure tbDisconnectedClick(Sender: TObject);procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);procedure tbSendClick(Sender: TObject);procedure tbCloseClick(Sender: TObject);procedure FormShow(Sender: TObject);procedure ClientSocketConnect(Sender: TObject;Socket: TCustomWinSocket);procedure ClientSocketConnecting(Sender: TObject;Socket: TCustomWinSocket);procedure ClientSocketDisconnect(Sender: TObject;Socket: TCustomWinSocket);procedure FormClose(Sender: TObject; var Action: TCloseAction);procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;ErrorEvent: TErrorEvent; var ErrorCode: Integer);private{ Private declarations }public{ Public declarations }end;varfrmClientMain: TfrmClientMain;implementation{$R *.DFM}//打开套接字连接procedure TfrmClientMain.tbConnectedClick(Sender: TObject);beginClientSocket.Open ;end;//关闭套接字连接procedure TfrmClientMain.tbDisconnectedClick(Sender: TObject);beginClientSocket.Close;end;//接受服务器端的回复procedure TfrmClientMain.ClientSocketRead(Sender: TObject;Socket: TCustomWinSocket);beginMemo1.Lines.Add(Socket.ReceiveText);end;//发送信息到服务器端procedure TfrmClientMain.tbSendClick(Sender: TObject);beginClientSocket.Socket.SendText(Edit1.Text); end;procedure TfrmClientMain.tbCloseClick(Sender: TObject);beginClose;end;//设置要连接的服务器端地址procedure TfrmClientMain.FormShow(Sender: TObject);beginClientSocket.Host := SocketHost;end;//已经连接到服务器端procedure TfrmClientMain.ClientSocketConnect(Sender: TObject;Socket: TCustomWinSocket);begintbSend.Enabled := True;tbDisconnected.Enabled :=True;btnSend.Enabled := True;StatusBar.Panels[0].Text := 已经连接到 + Socket.RemoteHost ;end;//正在连接到服务器端procedure TfrmClientMain.ClientSocketConnecting(Sender: TObject;Socket: TCustomWinSocket);beginStatusBar.Panels[0].Text := 正在连接到服务器... ;end;//当断开与服务器端的连接时发生procedure TfrmClientMain.ClientSocketDisconnect(Sender: TObject;Socket: TCustomWinSocket);begintbSend.Enabled := False;btnSend.Enabled := False;tbDisconnected.Enabled := False;StatusBar.Panels[0].Text := 已经断开与 + Socket.RemoteHost + 的连接;end;procedure TfrmClientMain.FormClose(Sender: TObject;var Action: TCloseAction);beginClientSocket.Close ;end;//当与服务器端的连接发生错误时procedure TfrmClientMain.ClientSocketError(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer);beginStatusBar.Panels[0].Text := 与服务器端的连接发生错误;ErrorCode := 0;end;end.
小结
上述方法是比较简单的实现方法,同时也是相对较容易理解的方法。
通过这个方法,笔者成功实现了局域网内多个
客户端与服务器端进行Socket通信的功能,同时可以保证一个客户端的连接、通信或是断开都不影响其它客户端的
正常通信。