网络聊天程序的编写

Posted on 2005-07-09 22:38  flourish  阅读(637)  评论(0)    收藏  举报
大家平时都喜欢用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函数。通过设置控件的属性并调用其方法就可以轻易连接到一台远程计算机上去,并且还可以双向交换数据。
我估计冰河和风雪木马的信使就是这么做的,呵呵~~
   现在分两块分别介绍服务器端和客户端的编写
一,服务器端程序
     如图创建界面




设置winsock控件的Protocols属性为sckTCPProtocol.载入窗体时显示服务器的信息,代码如下
Private Sub Form_Load()
Num = 0
NumOnline = 0
tcpServer(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 If
End Sub


利用DataArrival事件处理来自远程计算机的新数据,代码如下
Private Sub tcpServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim sData As String
Dim 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 If
rtbSave.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 If

End Sub



单击“断开连接"按扭将中断和客户端的连接,代码如下
Private Sub Command1_Click()
For i = 1 To Num
    tcpServer(i).Close '中断所有连接

    Next i

End Sub




二,客户端程序
  创建一个新的项目,创建如图所示的界面。







设置服务器IP和端口号,单击”连接按钮将开始连接服务器,代码如下:
rivate Sub cmdConnect_Click()
On Error GoTo errhandle: '发生错误时跳转
tcpClient.RemoteHost = txtHost.Text '设置服务器IP和端口
tcpClient.RemotePort = txtPort.Text
tcpClient.Connect '开始连接
txtHost.Locked = True '锁定服务器信息
txtPort.Locked = True
NewClient = True '设置标志变量
Exit Sub
errhandle: '错误处理
    MsgBox Err.Description
End Sub
Private Sub tcpClient_Connect() '请求连接
tcpClient.SendData "C"
End Sub

利用DataArrival事件获得服务器发送的信息,代码如下:
Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)
Dim sData As String

tcpClient.GetData sData '获得数据
If sData = "C_OK" Then '判断是否为连接成功信息
cmdQuit.Enabled = True
MsgBox "连接成功!" '提示信息

NewClient = False

End If

rtbIn.Text = rtbIn.Text + Chr(10) + sData + CStr(Now()) '添加信息到文本框中
rtbIn.SelStart = Len(sData)
If sData = "Q_OK" Then '判断是否为中断连接信息
tcpClient.Close '中断连接
End If

End 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 If
Exit Sub
errhandle: '错误处理
    MsgBox Err.Description
End Sub



单击“断开"将向服务器发送中断连接的请求,代码如下
Private Sub cmdQuit_Click() '中断连接
On Error GoTo errhandle: '发生错误时跳转
tcpClient.SendData "Q" & CStr(Now()) '发送中断连接的请求
Exit Sub
errhandle: '错误处理
    MsgBox Err.Description
End Sub

上面的代码注释很详细吧,我看谁再敢给我提意见说我写的程序没注释,菜鸟
看不懂之类的(我是开玩笑的哦~~,你别老用那种可怕的眼光看我啊,东方)
这次可真是累死我了,还好终于完工了,希望这篇文章对大家能有所帮助
如果有问题或修改意见请跟帖,我们大家一起讨论,谢谢哦~~
以上代码在winXP+VB6.0中文企业版下通过,如果需要源程序的可以联系我
或者跟帖提供你的邮箱,我会尽快发送给你~~

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3