主函数中,通过新开线程来监听多个客户端的连接
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处就会报错:“无法读取数据流”。
很奇怪为什么会出现这个问题,按说只有客户端发送数据之后才会出现这个问题。
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处就会报错:“无法读取数据流”。
很奇怪为什么会出现这个问题,按说只有客户端发送数据之后才会出现这个问题。
StateObject state = new StateObject();
把这段放在一个等待接收的循环中.当接收长度达到,或者接到结束符,才跳出往后执行.
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