📄 socket编程.htm
字号:
sessions <font color="#000000"><b>do</b></font><br>
<font color="#000000"><b>begin</b></font><br>
<font color="#000000"><b>if</b></font>
session[i].CHandle =Socket.SocketHandle <font color="#000000"><b>then</b></font><br>
<font color="#000000"><b>begin</b></font><br>
session[i].CHandle :=0;<br>
session[i].CUsed := <font color="#000000"><b>False</b></font>;<br>
Break;<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#000000"><b>end</b></font>;<br>
StatusBar.Panels[0].Text :='客户端
'+Socket.RemoteHost + ' 已经断开';<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#770000"><i>//关闭窗口<br>
</i></font><font color="#000000"><b>procedure</b></font>
TfrmServerMain.tbCloseClick(Sender: TObject);<br>
<font color="#000000"><b>begin</b></font><br>
Close;<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#000000"><b>procedure</b></font>
TfrmServerMain.FormCreate(Sender: TObject);<br>
<font color="#000000"><b>begin</b></font><br>
sessions := 0;<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#000000"><b>procedure</b></font>
TfrmServerMain.FormClose(Sender: TObject;<br>
<font color="#000000"><b>var</b></font> Action: TCloseAction);<br>
<font color="#000000"><b>begin</b></font><br>
ServerSocket.Close ;<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#770000"><i>//当客户端正在与服务器端连接时<br>
</i></font><font color="#000000"><b>procedure</b></font>
TfrmServerMain.ServerSocketGetSocket(Sender: TObject;<br>
Socket: Integer; <font color="#000000"><b>var</b></font>
ClientSocket: TServerClientWinSocket);<br>
<font color="#000000"><b>begin</b></font><br>
StatusBar.Panels[0].Text :='客户端正在连接...';<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#770000"><i>//客户端发生错误<br>
</i></font><font color="#000000"><b>procedure</b></font>
TfrmServerMain.ServerSocketClientError(Sender: TObject;<br>
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;<br>
<font color="#000000"><b>var</b></font> ErrorCode: Integer);<br>
<font color="#000000"><b>begin</b></font><br>
StatusBar.Panels[0].Text :='客户端'+Socket.RemoteHost
+'发生错误!';<br>
ErrorCode := 0;<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#000000"><b>end.</b></font></code></td>
</tr>
</tbody>
</table>
</div>
<br>
· 客户端源码(uClientMain.pas):<br>
<div align="center">
<table borderColor="#d0a070" cellSpacing="0" borderColorDark="#ffffff" cellPadding="5" width="99%" bgColor="#ffffc0" border="1">
<tbody>
<tr>
<td><code><br>
<font color="#000000"><b>unit</b></font> uClientMain;<br>
<font color="#000000"><b>interface</b></font><br>
<font color="#000000"><b>uses</b></font><br>
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,<br>
ScktComp, ComCtrls, ToolWin, ExtCtrls, StdCtrls, Buttons;<br>
<font color="#000000"><b>const</b></font><br>
SocketHost = '172.16.1.6'; <font color="#770000"><i>//服务器端地址<br>
</i></font><font color="#000000"><b>type</b></font><br>
TfrmClientMain = <font color="#000000"><b>class</b></font>(TForm)<br>
ControlBar1: TControlBar;<br>
ToolBar1: TToolBar;<br>
tbConnected: TToolButton;<br>
tbSend: TToolButton;<br>
tbClose: TToolButton;<br>
tbDisconnected: TToolButton;<br>
ClientSocket: TClientSocket;<br>
Edit1: TEdit;<br>
Memo1: TMemo;<br>
StatusBar: TStatusBar;<br>
btnSend: TBitBtn;<br>
<font color="#000000"><b>procedure</b></font>
tbConnectedClick(Sender: TObject);<br>
<font color="#000000"><b>procedure</b></font>
tbDisconnectedClick(Sender: TObject);<br>
<font color="#000000"><b>procedure</b></font>
ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);<br>
<font color="#000000"><b>procedure</b></font>
tbSendClick(Sender: TObject);<br>
<font color="#000000"><b>procedure</b></font>
tbCloseClick(Sender: TObject);<br>
<font color="#000000"><b>procedure</b></font> FormShow(Sender:
TObject);<br>
<font color="#000000"><b>procedure</b></font>
ClientSocketConnect(Sender: TObject;<br>
Socket: TCustomWinSocket);<br>
<font color="#000000"><b>procedure</b></font>
ClientSocketConnecting(Sender: TObject;<br>
Socket: TCustomWinSocket);<br>
<font color="#000000"><b>procedure</b></font>
ClientSocketDisconnect(Sender: TObject;<br>
Socket: TCustomWinSocket);<br>
<font color="#000000"><b>procedure</b></font> FormClose(Sender:
TObject; <font color="#000000"><b>var</b></font> Action:
TCloseAction);<br>
<font color="#000000"><b>procedure</b></font>
ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;<br>
ErrorEvent: TErrorEvent; <font color="#000000"><b>var</b></font>
ErrorCode: Integer);<br>
<font color="#000000"><b>private</b></font><br>
<font color="#770000"><i>{ Private declarations }</i></font><br>
<font color="#000000"><b>public</b></font><br>
<font color="#770000"><i>{ Public declarations }</i></font><br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#000000"><b>var</b></font><br>
frmClientMain: TfrmClientMain;<br>
<font color="#000000"><b>implementation</b></font><br>
<font color="#770000"><i>{$R *.DFM}</i></font><br>
<font color="#770000"><i>//打开套接字连接<br>
</i></font><font color="#000000"><b>procedure</b></font>
TfrmClientMain.tbConnectedClick(Sender: TObject);<br>
<font color="#000000"><b>begin</b></font><br>
ClientSocket.Open ;<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#770000"><i>//关闭套接字连接<br>
</i></font><font color="#000000"><b>procedure</b></font>
TfrmClientMain.tbDisconnectedClick(Sender: TObject);<br>
<font color="#000000"><b>begin</b></font><br>
ClientSocket.Close;<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#770000"><i>//接受服务器端的回复<br>
</i></font><font color="#000000"><b>procedure</b></font>
TfrmClientMain.ClientSocketRead(Sender: TObject;<br>
Socket: TCustomWinSocket);<br>
<font color="#000000"><b>begin</b></font><br>
Memo1.Lines.Add(Socket.ReceiveText);<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#770000"><i>//发送信息到服务器端<br>
</i></font><font color="#000000"><b>procedure</b></font>
TfrmClientMain.tbSendClick(Sender: TObject);<br>
<font color="#000000"><b>begin</b></font><br>
ClientSocket.Socket.SendText(Edit1.Text);<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#000000"><b>procedure</b></font>
TfrmClientMain.tbCloseClick(Sender: TObject);<br>
<font color="#000000"><b>begin</b></font><br>
Close;<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#770000"><i>//设置要连接的服务器端地址<br>
</i></font><font color="#000000"><b>procedure</b></font>
TfrmClientMain.FormShow(Sender: TObject);<br>
<font color="#000000"><b>begin</b></font><br>
ClientSocket.Host := SocketHost;<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#770000"><i>//已经连接到服务器端<br>
</i></font><font color="#000000"><b>procedure</b></font>
TfrmClientMain.ClientSocketConnect(Sender: TObject;<br>
Socket: TCustomWinSocket);<br>
<font color="#000000"><b>begin</b></font><br>
tbSend.Enabled := <font color="#000000"><b>True</b></font>;<br>
tbDisconnected.Enabled :=<font color="#000000"><b>True</b></font>;<br>
btnSend.Enabled := <font color="#000000"><b>True</b></font>;<br>
StatusBar.Panels[0].Text := '已经连接到 '+
Socket.RemoteHost ;<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#770000"><i>//正在连接到服务器端<br>
</i></font><font color="#000000"><b>procedure</b></font>
TfrmClientMain.ClientSocketConnecting(Sender: TObject;<br>
Socket: TCustomWinSocket);<br>
<font color="#000000"><b>begin</b></font><br>
StatusBar.Panels[0].Text := '正在连接到服务器...
' ;<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#770000"><i>//当断开与服务器端的连接时发生<br>
</i></font><font color="#000000"><b>procedure</b></font>
TfrmClientMain.ClientSocketDisconnect(Sender: TObject;<br>
Socket: TCustomWinSocket);<br>
<font color="#000000"><b>begin</b></font><br>
tbSend.Enabled := <font color="#000000"><b>False</b></font>;<br>
btnSend.Enabled := <font color="#000000"><b>False</b></font>;<br>
tbDisconnected.Enabled := <font color="#000000"><b>False</b></font>;<br>
StatusBar.Panels[0].Text := '已经断开与 '+
Socket.RemoteHost +' 的连接';<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#000000"><b>procedure</b></font>
TfrmClientMain.FormClose(Sender: TObject;<br>
<font color="#000000"><b>var</b></font> Action: TCloseAction);<br>
<font color="#000000"><b>begin</b></font><br>
ClientSocket.Close ;<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#770000"><i>//当与服务器端的连接发生错误时<br>
</i></font><font color="#000000"><b>procedure</b></font>
TfrmClientMain.ClientSocketError(Sender: TObject;<br>
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;<br>
<font color="#000000"><b>var</b></font> ErrorCode: Integer);<br>
<font color="#000000"><b>begin</b></font><br>
StatusBar.Panels[0].Text := '与服务器端的连接发生错误';<br>
ErrorCode := 0;<br>
<font color="#000000"><b>end</b></font>;<br>
<font color="#000000"><b>end.</b></font></code></td>
</tr>
</tbody>
</table>
</div>
<br>
<br>
小结<br>
上述方法是比较简单的实现方法,同时也是相对较容易理解的方法。通过这个方法,笔者成功实现了局域网内多个客户端与服务器端进行Socket通信的功能,同时可以保证一个客户端的连接、通信或是断开都不影响其它客户端的正常通信。<br>
<br>
附录:<br>
服务器端窗体和客户端窗体及组件的属性设置参加相应的DFM文件。<br>
uServerMain.pas对应的DFM文件(uServerMain.dfm)<br>
<div align="center">
<table borderColor="#d0a070" cellSpacing="0" borderColorDark="#ffffff" cellPadding="5" width="99%" bgColor="#ffffc0" border="1">
<tbody>
<tr>
<td><code><br>
<font color="#000000"><b>object</b></font> frmServerMain:
TfrmServerMain<br>
Left = 297<br>
Top = 258<br>
BorderIcons = [biSystemMenu, biMinimize]<br>
BorderStyle = bsSingle<br>
Caption = 'ServerSocket'<br>
ClientHeight = 279<br>
ClientWidth = 476<br>
Color = clBtnFace<br>
Font.Charset = <font color="#000000"><b>DEFAULT</b></font>_CHARSET<br>
Font.Color = clWindowText<br>
Font.Height = -11<br>
Font.Name = 'MS Sans Serif'<br>
Font.Style = []<br>
OldCreateOrder = <font color="#000000"><b>False</b></font><br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -