C# 在C语言中从单个网络流发送多种类型的数据#
我正在创建一个类似于Microsoft Netmeeting的程序,因为我必须从单个连接发送多种类型的数据,例如鼠标位置、按键以及一次屏幕截图。我成功地向客户端发送和接收屏幕截图,但我无法理解如何通过单个连接发送多个数据 我认为这需要多个端口。一个用于屏幕截图,一个用于鼠标位置,一个用于按键 以下是我正在使用的代码: 服务器=屏幕截图的发送者、鼠标点和按键的接收者。 客户端=屏幕截图的接收者、鼠标和按键的发送者 服务器:C# 在C语言中从单个网络流发送多种类型的数据#,c#,networking,tcp,tcpclient,C#,Networking,Tcp,Tcpclient,我正在创建一个类似于Microsoft Netmeeting的程序,因为我必须从单个连接发送多种类型的数据,例如鼠标位置、按键以及一次屏幕截图。我成功地向客户端发送和接收屏幕截图,但我无法理解如何通过单个连接发送多个数据 我认为这需要多个端口。一个用于屏幕截图,一个用于鼠标位置,一个用于按键 以下是我正在使用的代码: 服务器=屏幕截图的发送者、鼠标点和按键的接收者。 客户端=屏幕截图的接收者、鼠标和按键的发送者 服务器: void StartListen() { try {
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");
}
}
您可以使用单个连接,但必须在读取数据之前为接收器提供一种区分数据类型(及其大小)的方法
也就是说,如果您编写连接的两侧(客户机+服务器),那么使用WCF这样的技术要简单得多。它将允许您传递具有强类型数据的完整类实例,并自动为您处理底层传输(以可配置的方式)。简而言之:您可以在流中使用头。在接收端,您读取标题并相应地切换 对于一个简单的单字节头,这可能是类似于 类型“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;
}
}
}