1

我想用 C# 从网络流中读取数据。

我有一个定期轮询的客户端列表,但是当我开始从一个客户端读取数据时,我必须阅读整个 xml 消息,然后继续到下一个客户端。如果接收数据有一些延迟,我不应该去下一个客户。我应该等待一段时间并获取数据。另外,我不应该无限期地等待。只需超时并在 x 秒后继续下一个客户端....

if(s.Available > 0)
{
//read data till i get the whole message.
//timeout and continue with other clients if I dont recieve the whole message 
//within x seconds.
}

有没有办法在 C# 中优雅地做到这一点?

4

3 回答 3

1

据我所知,没有办法做到这一点,所以你很可能最终会使用多个线程。恕我直言,每个客户端使用一个线程首先是一个更清洁的解决方案,然后您可以在流上调用 Read() ,它可以根据需要花费任意时间,而其他线程对其他客户端执行相同操作.

线程一开始可能有点吓人,特别是如果您使用的是 Windows 窗体(无处不在的委托!)而不是控制台应用程序,但它们非常有用。如果使用得当,它们可以提供很大帮助,尤其是在网络领域。

于 2009-03-20T22:03:48.923 回答
0
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class SynchronousSocketClient {

    public static void StartClient() {
        // Data buffer for incoming data.
        byte[] bytes = new byte[1024];

        // Connect to a remote device.
        try {
            // Establish the remote endpoint for the socket.
            // This example uses port 11000 on the local computer.
            IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName())
            IPAddress ipAddress = ipHostInfo.AddressList[0];
            IPEndPoint remoteEP = new IPEndPoint(ipAddress,11000);

            // Create a TCP/IP  socket.
            Socket sender = new Socket(AddressFamily.InterNetwork, 
                SocketType.Stream, ProtocolType.Tcp );

            // Connect the socket to the remote endpoint. Catch any errors.
            try {
                sender.Connect(remoteEP);

                Console.WriteLine("Socket connected to {0}",
                    sender.RemoteEndPoint.ToString());

                // Encode the data string into a byte array.
                byte[] msg = Encoding.ASCII.GetBytes("This is a test<EOF>");

                // Send the data through the socket.
                int bytesSent = sender.Send(msg);

                // Receive the response from the remote device.
                int bytesRec = sender.Receive(bytes);
                Console.WriteLine("Echoed test = {0}",
                    Encoding.ASCII.GetString(bytes,0,bytesRec));

                // Release the socket.
                sender.Shutdown(SocketShutdown.Both);
                sender.Close();

            } catch (ArgumentNullException ane) {
                Console.WriteLine("ArgumentNullException : {0}",ane.ToString());
            } catch (SocketException se) {
                Console.WriteLine("SocketException : {0}",se.ToString());
            } catch (Exception e) {
                Console.WriteLine("Unexpected exception : {0}", e.ToString());
            }

        } catch (Exception e) {
            Console.WriteLine( e.ToString());
        }
    }

    public static int Main(String[] args) {
        StartClient();
        return 0;
    }
}

(取自“msdn 上的同步客户端套接字示例)

于 2009-03-20T22:03:14.213 回答
0

不,没有办法做到这一点。TCP 不保证所有内容都立即到达,因此您需要知道 XML 的大小才能知道是否所有内容都已到达。而你不知道。正确的?

使用异步方法是可行的方法(并使用 XML 构建字符串)

于 2010-10-28T08:35:07.950 回答