2010-01-15 61 views
2

我試圖建立一個簡單的聊天客戶端/軟件(整個在可執行文件)至極從5900端口開始偵聽,當客戶端連接到該端口聊天建立。用一種或兩種方式聊天系統?

問題是隻有客戶端可以與服務器聊天,服務器無法回答客戶端,因爲連接是以單向方式工作的。

我試圖從「服務器」連接到客戶端,當它建立連接但系統崩潰警告我,該端口已被使用。

這是我的代碼:(以某種方式工作)

Imports System.Net.Sockets 
Imports System.Text 
Imports System.Reflection 

Public Class frmComplete 
    Dim Data As Integer 
    Dim Message As String 

    Private sServer As TcpListener 
    Private sClient As New TcpClient 

    Private cServer As TcpListener 
    Private cClient As New TcpClient 
    Private cNick As String 

    Dim BufferSize(1024) As Byte 

    Private Delegate Sub MessageDelegate(ByVal Message As String) 

Private Sub frmComplete_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    srvListen(5900) 
    btnSend.Enabled = False 
End Sub 

Private Sub OnServerConnect(ByVal AR As IAsyncResult) 
    sClient = sServer.EndAcceptTcpClient(AR) 

    sClient.GetStream.BeginRead(BufferSize, 0, BufferSize.Length, AddressOf OnRead, Nothing) 

    My.Computer.Audio.Play(Application.StartupPath & "\Connected.wav", AudioPlayMode.Background) 
End Sub 

Private Sub OnRead(ByVal AR As IAsyncResult) 
    Data = sClient.GetStream.EndRead(AR) 
    Message = Encoding.ASCII.GetString(BufferSize, 0, Data) 

    Dim Args As Object() = {Message} 
    Me.Invoke(New MessageDelegate(AddressOf PrintMessage), Args) 

    sClient.GetStream.BeginRead(BufferSize, 0, BufferSize.Length, AddressOf OnRead, Nothing) 
End Sub 

Private Sub PrintMessage(ByVal Message As String) 
    Try 
     txtChat.Text = txtChat.Text & Message & vbCrLf 
     My.Computer.Audio.Play(Application.StartupPath & "\Message.wav", AudioPlayMode.Background) 
    Catch ex As Exception 
     MsgBox(ex.Message, MsgBoxStyle.Critical) 
    End Try 
End Sub 

Private Sub srvListen(ByVal port As Integer) 
    Try 
     sServer = New TcpListener(System.Net.IPAddress.Any, 5900) 
     sServer.Start() 

     'THIS WILL RAISE THE EVENT WHEN A CLIENT IS CONNECTED 
     sServer.BeginAcceptTcpClient(AddressOf OnServerConnect, Nothing) 
    Catch ex As Exception 
     MsgBox(ex.Message, MsgBoxStyle.Critical) 
    End Try 
End Sub 



Private Sub txtMessage_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtMessage.KeyDown 
    'FIXME (SOUND T_T) 
    If e.KeyCode = Keys.Enter Then 
     SendMessage(cNick & ":" & txtMessage.Text) 
    End If 
End Sub 

Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click 
    ConnectToServer(txtIP.Text) 
    cNick = txtNickname.Text 

    txtNickname.Enabled = False 
    txtIP.Enabled = False 
    btnConnect.Enabled = False 
End Sub 

Private Sub ConnectToServer(ByVal ipadress As String) 
    Try 
     cClient.BeginConnect(ipadress, 5900, AddressOf OnClientConnect, Nothing) 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
End Sub 

Private Sub OnClientConnect(ByVal AR As IAsyncResult) 
    Try 
     cClient.EndConnect(AR) 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
End Sub 

Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click 
    If Not String.IsNullOrEmpty(txtMessage.Text) Then 

     txtChat.Text = txtChat.Text & "Me:" & txtMessage.Text & vbCrLf 
     SendMessage(cNick & ":" & txtMessage.Text) 

    End If 
End Sub 

Private Sub SendMessage(ByVal message As String) 
    If cClient.Connected = True Then 
     Dim Writer As New IO.StreamWriter(cClient.GetStream) 
     Writer.Write(message) 
     Writer.Flush() 
    End If 

    txtMessage.Text = "" 
End Sub 

Private Sub SendCommand(ByVal command As String) 
    If cClient.Connected = True Then 
     Dim Writer As New IO.StreamWriter(cClient.GetStream) 
     Writer.Write(command) 
     Writer.Flush() 
    End If 

    txtMessage.Text = "" 
End Sub 

Private Sub txtMessage_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtMessage.TextChanged 
    If Not String.IsNullOrEmpty(txtMessage.Text) Then 
     btnSend.Enabled = True 
    Else 
     btnSend.Enabled = False 
    End If 
End Sub 
End Class 

我應該怎麼辦?使用兩個端口?一個用於寫入,另一個用於讀取?如果我需要將多個客戶端連接到一個用戶? (還記得同樣是exe文件服務器/客戶端)

請幫我=(

回答

1

您沒有讀取任何數據來從服務器返回的您將在調用的BeginRead OnServerConnect方法注意 - 您也需要在OnClientConnect方法中爲您的客戶端執行此操作,否則您將獲得單向通信。也許這就是爲什麼您沒有看到任何數據通過?

我猜測,當您的服務器將數據發送回客戶端,您沒有發生硬錯誤,只是沒有數據。

只是看看你的代碼注意到你的客戶端和服務器都有一個TcpClient和TcpListener。你不需要這個。您的SERVER將是TcpListener,並且您的CLIENT將是TcpClient。通過詢問是否應該從服務器端連接到不同的端口,您正在簡化自己的TCP連接。一旦你的TcpClient連接到TcpServer,你的連接就建立了。沒有必要進一步嘗試連接。

你的客戶端代碼應該是類似的東西:

Private Sub OnClientConnect(ByVal AR As IAsyncResult) 
    Try 
     cClient.EndConnect(AR) 
    sServer.GetStream.BeginRead(BufferSize, 0, BufferSize.Length, AddressOf OnClientRead, Nothing) 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
End Sub 


Private Sub OnClientRead(ByVal AR As IAsyncResult) 
    Data = sServer.GetStream.EndRead(AR) 
    Message = Encoding.ASCII.GetString(BufferSize, 0, Data) 

    Dim Args As Object() = {Message} 
    Me.Invoke(New MessageDelegate(AddressOf PrintMessage), Args) 

    sServer.GetStream.BeginRead(BufferSize, 0, BufferSize.Length, AddressOf OnClientRead, Nothing) 
End Sub 
+0

它能正常工作,但這一翻譯sServer是客戶端:P – 2010-01-15 18:10:35

+0

所以是你的問題? – 2010-01-15 18:26:07

+0

客戶端未在監聽服務器,因此它是單向聊天。 – 2010-01-15 18:34:29