| 关键词: nbsp 信息 tcpServer Text rtbSave 服务器 代码 sData Sub tcpClient |
作者:小珂 转自:黑基bbs原创作品版 大家平时都喜欢用QQ聊天或交流技术,原因就不要再多说了哦~,相信大家都比我更有体会,但有没有人想自己写一个聊天程序呢,我就想写个自己专用的啦,那该多爽!现在估计你也想#¥%·了,呵呵下面就让我带你一步步实现吧~~ 这个程序主要是介绍如何利用TCP协议进行网络聊天的。 下面简要的介绍一下TCP,TCP即数据传输控制协议,它允许创建和维护与远程计算机的连接,利用TCP协议连接两台计算机就可彼此进行数据传输。 如果创建客户应用程序,就必须知道服务器计算机名或者IP地址(remotehost属性),还要知道进行“侦听”的端口(remoteport属性),然后调用connect方法。 如果创建服务器应用程序,就应设置一个收听端口(Localport属性)并调用listen方法。 当客户计算机需要连接时就会发生ConnectionRequest事件。为了完成连接,可调用ConnectionRequest事件内的Accept方法。 建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用SendData方法。当接受数据时会发生DataArrival事件。调用DataArrival事件内的GetData方法就可获取数据。 winsock控件提供了访问TCP和UDP网络服务的方便途径,UDP即用户数据报协议,是一个无连接的协议。跟TCP的操作不同,计算机并不建立连接。另外UDP应用程序可以是客户机,也可以是服务器。为编写客户或服务应用程序,不必了解TCP的细节或调用低级的winsock API函数。通过设置控件的属性并调用其方法就可以轻易连接到一台远程计算机上去,并且还可以双向交换数据。我估计冰河和风雪木马的信使就是这么做的,呵呵~~ 现在分两块分别介绍服务器端和客户端的编写一,服务器端程序 如图创建界面screen.width-333) {this.width=screen.width-333;this.alt='Click Here to Open New Window';}" border=0>设置winsock控件的Protocols属性为sckTCPProtocol.载入窗体时显示服务器的信息,代码如下Private Sub Form_Load()Num = 0NumOnline = 0tcpServer(0).LocalPort = 2000 '设置本地端口tcpServer(0).Listen '开始监听Label1.Caption = Label1.Caption + CStr(tcpServer(0).LocalIP) '显示服务器信息Label3.Caption = Label3.Caption + CStr(tcpServer(0).LocalPort)End Sub利用ConnectionRequest事件处理来自远程计算机的请求,代码如下Private Sub tcpServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)If Index = 0 Then '创建新的Socket,并连接 Num = Num + 1 NumOnline = NumOnline + 1 Load tcpServer(Num) tcpServer(Num).LocalPort = 0 tcpServer(Num).Accept requestID End IfEnd Sub利用DataArrival事件处理来自远程计算机的新数据,代码如下Private Sub tcpServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)Dim sData As StringDim sName As String tcpServer(Index).GetData sData '接受数据 rtbSave.SelStart = Len(rtbSave.Text) sName = Left(sData, 1) '获得第一个字符,判断信息类型 If sName = "C" Then 'C为请求连接的信息 lstClient.AddItem sData + CStr(Now()) '添加用户登陆的信息 tcpServer(Index).SendData "C_OK" '返回连接成功的信息 ElseIf sName = "Q" Then 'Q为请求中断连接的信息 tcpServer(Index).SendData "Q_OK." '返回信息 lstClient.AddItem sData + CStr(Now()) '添加用户中断连接的信息 tcpServer(Index).Close '中断连接 NumOnline = NumOnline - 1 rtbSave.SelStart = Len(rtbSave.Text) rtbSave.Text = rtbSave.Text + sData End IfrtbSave.SelStart = Len(rtbSave.Text) '添加信息内容 rtbSave.Text = rtbSave.Text + Chr(10) + sData + CStr(Now()) rtbSave.SelStart = Len(rtbSave.Text) End Sub在文本框内输入内容,按回车键开始发送信息,代码如下Private Sub TxtSend_KeyUp(KeyCode As Integer, Shift As Integer)If KeyCode = 13 Then '判断是否为回车 For i = 1 To Num If tcpServer(i).State = sckClosed Then '给所有客户端发送信息 '判断Socket连接状态 Exit For Else tcpServer(i).SendData "服务器:" & TxtSend.Text '发送信息 End If Next i rtbSave.SelStart = Len(rtbSave.Text)rtbSave.Text = rtbSave.Text + Chr(10) + "服务器:" & TxtSend.Text & CStr(Now()) '在文本框中添加内容TxtSend.Text = ""End IfEnd Sub单击“断开连接"按扭将中断和客户端的连接,代码如下Private Sub Command1_Click()For i = 1 To Num tcpServer(i).Close '中断所有连接 Next iEnd Sub二,客户端程序 创建一个新的项目,创建如图所示的界面。screen.width-333) {this.width=screen.width-333;this.alt='Click Here to Open New Window';}" border=0>设置服务器IP和端口号,单击”连接按钮将开始连接服务器,代码如下:rivate Sub cmdConnect_Click()On Error GoTo errhandle: '发生错误时跳转tcpClient.RemoteHost = txtHost.Text '设置服务器IP和端口tcpClient.RemotePort = txtPort.TexttcpClient.Connect '开始连接txtHost.Locked = True '锁定服务器信息txtPort.Locked = TrueNewClient = True '设置标志变量Exit Suberrhandle: '错误处理 MsgBox Err.DescriptionEnd SubPrivate Sub tcpClient_Connect() '请求连接tcpClient.SendData "C"End Sub利用DataArrival事件获得服务器发送的信息,代码如下:Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)Dim sData As StringtcpClient.GetData sData '获得数据If sData = "C_OK" Then '判断是否为连接成功信息cmdQuit.Enabled = TrueMsgBox "连接成功!" '提示信息NewClient = FalseEnd IfrtbIn.Text = rtbIn.Text + Chr(10) + sData + CStr(Now()) '添加信息到文本框中rtbIn.SelStart = Len(sData)If sData = "Q_OK" Then '判断是否为中断连接信息tcpClient.Close '中断连接End IfEnd Sub在文本框内输入内容,按回车键开始发送信息,代码如下Private Sub txtOut_KeyUp(KeyCode As Integer, Shift As Integer) '发送信息On Error GoTo errhandle: '发生错误时跳转If KeyCode = 13 Then '判断是否为回车tcpClient.SendData "客户端:" & txtOut.Text '发送信息rtbIn.Text = rtbIn.Text + Chr(10) + "客户端:" & txtOut.Text & CStr(Now()) '添加信息到文本框中txtOut.Text = ""End IfExit Suberrhandle: '错误处理 MsgBox Err.DescriptionEnd Sub单击“断开"将向服务器发送中断连接的请求,代码如下Private Sub cmdQuit_Click() '中断连接On Error GoTo errhandle: '发生错误时跳转tcpClient.SendData "Q" & CStr(Now()) '发送中断连接的请求Exit Suberrhandle: '错误处理 MsgBox Err.DescriptionEnd Sub上面的代码注释很详细吧,我看谁再敢给我提意见说我写的程序没注释,菜鸟看不懂之类的(我是开玩笑的哦~~,你别老用那种可怕的眼光看我啊,东方)这次可真是累死我了,还好终于完工了,希望这篇文章对大家能有所帮助如果有问题或修改意见请跟帖,我们大家一起讨论,谢谢哦~~以上代码在winXP+VB6.0中文企业版下通过,如果需要源程序的可以联系我或者跟帖提供你的邮箱,我会尽快发送给你~~ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|