【问题标题】:Sending multiple type of data from a single network stream in C#在 C# 中从单个网络流发送多种类型的数据
【发布时间】:2011-10-26 17:13:04
【问题描述】:

我正在创建一个类似于 Microsoft Netmeeting 的程序,因为我必须从单个连接发送多种类型的数据,例如鼠标位置、按下的键和一次关闭屏幕截图。我成功地向客户端发送和接收屏幕截图,但我无法理解如何通过单一连接发送多个数据。

我认为为此需要多个端口。一个用于屏幕截图,一个用于鼠标位置,一个用于按键。

以下是我正在使用的代码: 服务器 = ScreenShot 的发送者,MousePos 和 Key 的接收者。 Client = ScreenShot 的接收者,MousePos 和 Key 的发送者。

服务器:

void StartListen()
{
    try
    {
        IPEndPoint ipendp = new IPEndPoint(IPAddress.Parse(OwnIP()), 532);
        tcpl = new TcpListener(ipendp);
        tcpl.Start();
        s1 = tcpl.AcceptSocket();
        ns = new NetworkStream(s1);
        timer1.Enabled = true;
        while (true)
        {
            byte[] buffer = imageToByteArray(CaptureScreenShot());
            s1.Send(buffer, buffer.Length, SocketFlags.None);
            Thread.Sleep(250);
        }
    }
    catch
    {
        tcpl.Stop();
        ns.Close();
        //tcpl.EndAcceptSocket();
        Form1_Load(0,EventArgs.Empty);
    }
}

客户:

void StartClient()
{
    try
    {

        IPEndPoint ipendp = new IPEndPoint(IPAddress.Parse(toolStripTextBox1.Text), 532);
        this.Text = "SWare Application - " + toolStripTextBox1.Text + ":532";
        tcpc = new TcpClient();
        tcpc.Connect(ipendp);
        Socket s1 = tcpc.Client;
        ns = tcpc.GetStream();

        while (true)
        {
            byte[] b = new byte[500000];
            s1.Receive(b);
            MemoryStream ms = new MemoryStream(b);
            pictureBox1.Image = Image.FromStream(ms);
            //Thread.Sleep(250);
        }
    }
    catch
    {
        tcpc.Close();
        MessageBox.Show("Disconnected from the Remote PC");
    }
}

【问题讨论】:

    标签: c# networking tcp tcpclient


    【解决方案1】:

    您可以使用单个连接,但您必须为接收方提供一种在读取数据之前区分数据类型(及其大小)的方法。

    话虽如此,如果您要编写连接的两端(客户端 + 服务器),那么使用 WCF 之类的技术会简单得多。它将允许您传递具有强类型数据的完整类实例,并自动为您处理底层传输(以可配置的方式)。

    【讨论】:

      【解决方案2】:

      简而言之:您可以在流中使用标题。在接收端,您阅读标题并相应地切换。

      对于一个简单的单字节标题,这可能类似于...

      类型“a”的发件人:

      using (MemoryStream mems = new MemoryStream())
      {
          // Store data in MemoryStream
          // It's searchable which may be required
          // ...
          using (TcpClient tcp = newTcpClient())
          {
              using (NetworkStream ns = tcp.GetStream())
              {
                  ns.WriteByte((int)'a'); // Store data type header for type 'a'
                  mems.WriteTo(ns); // Write serialized data to network
              }
          }
      }
      

      接收者:

      void receiveData(NetworkStream ns)
      {
          using (MemoryStream mems = new MemoryStream())
          {
              int formatByte = ns.ReadByte(); // Read the data type header
      
              ns.CopyTo(mems);
              mems.Position = 0;
      
              switch (formatByte)
              {
                  case (int)'a': // Type A
                      // Read type 'a' from "mems"
                      // ...
                      break;
      
                  case (int)'b': // Type B
                      // Read type 'b' from "mems"
                      // ...
                      break;
      
                  default:
                      // In case you want to point out the unrecognized type
                      break;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-01
        • 2021-09-06
        • 1970-01-01
        • 2019-11-07
        • 1970-01-01
        • 2015-06-29
        相关资源
        最近更新 更多