⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socket编程.htm

📁 ServerSocket,ClientSocket控件源码,讲述内部实现原理
💻 HTM
📖 第 1 页 / 共 3 页
字号:
                sessions <font color="#000000"><b>do</b></font><br> 
                &nbsp;&nbsp;<font color="#000000"><b>begin</b></font><br>
                &nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000"><b>if</b></font> 
                session[i].CHandle =Socket.SocketHandle <font color="#000000"><b>then</b></font><br> 
                &nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000"><b>begin</b></font><br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session[i].CHandle :=0;<br> 
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session[i].CUsed := <font color="#000000"><b>False</b></font>;<br> 
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Break;<br>
                &nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000"><b>end</b></font>;<br>
                &nbsp;&nbsp;<font color="#000000"><b>end</b></font>;<br>
                &nbsp;&nbsp;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>
                &nbsp;&nbsp;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>
                &nbsp;&nbsp;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>
                &nbsp;&nbsp;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>
                &nbsp;&nbsp;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>
                &nbsp;&nbsp;StatusBar.Panels[0].Text :='客户端'+Socket.RemoteHost  
                +'发生错误!';<br>
                &nbsp;&nbsp;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>
                &nbsp;&nbsp;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>
                &nbsp;&nbsp;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>
                &nbsp;&nbsp;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>
                &nbsp;&nbsp;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>
                &nbsp;&nbsp;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>
                &nbsp;&nbsp;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>
                &nbsp;&nbsp;tbSend.Enabled := <font color="#000000"><b>True</b></font>;<br> 
                &nbsp;&nbsp;tbDisconnected.Enabled :=<font color="#000000"><b>True</b></font>;<br> 
                &nbsp;&nbsp;btnSend.Enabled := <font color="#000000"><b>True</b></font>;<br> 
                &nbsp;&nbsp;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>
                &nbsp;&nbsp;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>
                &nbsp;&nbsp;tbSend.Enabled := <font color="#000000"><b>False</b></font>;<br> 
                &nbsp;&nbsp;btnSend.Enabled := <font color="#000000"><b>False</b></font>;<br> 
                &nbsp;&nbsp;tbDisconnected.Enabled := <font color="#000000"><b>False</b></font>;<br> 
                &nbsp;&nbsp;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>
                &nbsp;&nbsp;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>
                &nbsp;&nbsp;StatusBar.Panels[0].Text := '与服务器端的连接发生错误';<br> 
                &nbsp;&nbsp;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>
      &nbsp;&nbsp;&nbsp;&nbsp;上述方法是比较简单的实现方法,同时也是相对较容易理解的方法。通过这个方法,笔者成功实现了局域网内多个客户端与服务器端进行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 + -