主函数中,通过新开线程来监听多个客户端的连接
TcpListener listener = new TcpListener(localEndPoint);
listener.Start();
while (true) 
{
Thread th = new Thread(new ThreadStart(ListenClient));
th.Start();
th.Join();
}public static void ListenClient() 
{
TcpClient client = listener.AcceptTcpClient(); 
NetworkStream ns = client.GetStream(); 
StateObject state = new StateObject();
state.nsClient = ns;
ns.BeginRead(state.buffer,0,StateObject.BufferSize,new AsyncCallback(ReadCallback),state);
}public static void ReadCallback(IAsyncResult ar) 
{
StateObject state = (StateObject) ar.AsyncState;
NetworkStream ns  = state.nsClient;   
try
{
int iRead = ns.EndRead(ar); 。
    
}
现在的问题是,在客户端连接成功之后,还没有发送数据之前,就会执行到ReadCallback,于是在ns.EndRead处就会报错:“无法读取数据流”。
很奇怪为什么会出现这个问题,按说只有客户端发送数据之后才会出现这个问题。

解决方案 »

  1.   

    NetworkStream ns = client.GetStream(); 
    StateObject state = new StateObject();
    把这段放在一个等待接收的循环中.当接收长度达到,或者接到结束符,才跳出往后执行.
      

  2.   

    Public Sub New(ByVal client As TcpClient)
            Me.client = client
            Me.client.GetStream.BeginRead(readBuffer, 0, BUFFER_SIZE, AddressOf StreamReceiver, Nothing)
        End SubPrivate Sub StreamReceiver(ByVal ar As IAsyncResult)
            Dim BytesRead As Integer
            Dim strMessage As String        Try
                SyncLock client.GetStream
                    BytesRead = client.GetStream.EndRead(ar)
                End SyncLock            If BytesRead < 1 Then
                    Exit Sub
                End If            If Me.transferStatus = TRANSFER_STATUS.ASCII Then
                    strMessage = Encoding.ASCII.GetString(readBuffer, 0, BytesRead)                Select Case strMessage.Split(Chr(124))(0)
                        Case "FILE"
                            Me.transferStatus = TRANSFER_STATUS.Binary
                            fileSize = CInt(strMessage.Split(Chr(124))(1))
                           fileWritedSize = 0
                            RaiseEvent TransferFileBegin(Me, fileName)
                            fileStream = New IO.FileStream(fileName, IO.FileMode.OpenOrCreate, IO.FileAccess.Write)
                        Case "DOWN"
                            SendFile(strMessage.Split(Chr(124))(1))
                        Case Else
                              RaiseEvent LineReceived(Me, strMessage)
                    End Select            Else
                     fileWritedSize = fileWritedSize + BytesRead
                    Me.fileStream.Write(readBuffer, 0, BytesRead)
                    Me.fileStream.Flush()                 If fileWritedSize >= fileSize Then
                        Me.fileStream.Close()
                        Me.transferStatus = TRANSFER_STATUS.ASCII
                        RaiseEvent TransferFileEnd(Me, fileName)
                    End If
                End If            SyncLock client.GetStream
                    client.GetStream.BeginRead(readBuffer, 0, BUFFER_SIZE, AddressOf StreamReceiver, Nothing)
                End SyncLock
            Catch e As Exception
            End Try
        End Sub