[英]C# Multithreading socket server receiving data
我已经开发了这种小型多线程套接字服务器,该服务器创建一个套接字以不阻塞主程序,并为每个新接受的连接创建另一个线程。
问题是在读取数据时出现的,我有一个名为receiveData
的方法,该方法可以读取所有数据输入,因此,现在每个连接的代码只读取一次。
我通过在方法receiveData
的内部添加一个带有标志socket.CanRead
的while循环来解决此问题,此标志的作用是什么? CanRead
和DataAvailable
有什么区别?
class Server
{
static void receiveData(TcpClient client, NetworkStream stream)
{
byte[] bytes = new byte[client.ReceiveBufferSize];
stream.Read (bytes, 0, (int) client.ReceiveBufferSize);
string returndata = Encoding.UTF8.GetString (bytes);
Console.WriteLine ("SERVER RECEIVED: " + returndata);
}
static void startServer()
{
new Thread(() =>
{
TcpListener listener = new TcpListener(IPAddress.Any, 5000);
listener.Start();
while (true)
{
if (listener.Pending()) {
new Thread(() =>
{
TcpClient client = listener.AcceptTcpClient();
NetworkStream stream = client.GetStream();
Server.receiveData(client, stream);
}).Start();
}
}
}).Start();
}
static void Main(string[] args)
{
Server.startServer ();
}
}
请参考MSDN NetworkStream.CanRead属性 ,
可以阅读:
获取一个值,该值指示NetworkStream是否支持阅读。
而DataAvailable时:
获取一个值,该值指示要在NetworkStream上读取的数据是否可用。
就像传入的数据仅在NetworkStream支持读取时才被指示为可用,因此可以被读取。
看一下示例代码,我认为它将回答您所有的问题:
// Examples for CanRead, Read, and DataAvailable.
// Check to see if this NetworkStream is readable.
if(myNetworkStream.CanRead){
byte[] myReadBuffer = new byte[1024];
StringBuilder myCompleteMessage = new StringBuilder();
int numberOfBytesRead = 0;
// Incoming message may be larger than the buffer size.
do{
numberOfBytesRead = myNetworkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
}
while(myNetworkStream.DataAvailable);
// Print out the received message to the console.
Console.WriteLine("You received the following message : " +
myCompleteMessage);
}
else{
Console.WriteLine("Sorry. You cannot read from this NetworkStream.");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.