C# C将映像写入TCP套接字

C# C将映像写入TCP套接字,c#,C#,我有以下代码将图像从相机保存到磁盘: public static Image getAndSaveImage(int imageCount) { var image = _camera.GetImage() as ThermalImage; image.Palette = PaletteManager.Iron; _camera.GetImage().EnterLock(); Image camImage = _camera.GetImage().Image;

我有以下代码将图像从相机保存到磁盘:

public static Image getAndSaveImage(int imageCount)
{
    var image = _camera.GetImage() as ThermalImage;
    image.Palette = PaletteManager.Iron;
    _camera.GetImage().EnterLock();
    Image camImage = _camera.GetImage().Image;
    _camera.GetImage().ExitLock();
    camImage.Save("./images/picture" + Convert.ToString(imageCount) + ".bmp", System.Drawing.Imaging.ImageFormat.Bmp);
    return camImage;
}
如您所见,我正在将图像保存到一个文件中。目前,此方法是在循环中调用的。我想用websocket替换保存到磁盘,这样客户端就可以连接到此套接字并从底层流接收位图图像。因为位图是一个数组,所以应该可以工作,不是吗? 我读了一些我可以使用TcpListener类的文档。 因此,我将做以下工作:

TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 80);

server.Start();
TcpClient client = server.AcceptTcpClient();
NetworkStream stream = client.GetStream();
如何将位图图像写入该流,以便在另一个流上运行python客户端 一边 你能取回图像吗?我需要自己处理TCP握手吗


非常感谢

编辑:最初,这个问题是专门针对WebSocket提出的;下面的所有内容都基于该位置(现已删除)

WebSocket,RFC6455,不是一个裸套接字-它是一个非平凡的基于帧的协议,在转换到另一个协议之前类似于HTTP 1.1。所以如果你想使用WebSocket,你可能会想使用一个WebSocket服务器实现——我知道,手工操作并不有趣,相信我

如果你想要简单,ASP.NET包括ASP.NET核心和Kestrel有一个内置的WebSocket API,很简单

然而!因为它是基于帧的协议,所以您不会使用常规流。WebSocket有两种主要的数据帧类型:文本和二进制如果我们忽略早期只有文本的WebSocket原型,它基本上是一种不同的协议,对名称进行着色-显然,在您的情况下,您需要二进制,您最好的选择可能是更改现有代码以保存到MemoryStream,然后从MemoryStream获取缓冲区以传递给WebSocket API。最简单的方法是在MemoryStream上排列,但更有效的方法是使用GetBuffer或TryGetBuffer,并使用一个API,该API接受偏移量通常为0且长度为intmemoryStream.length的超大缓冲区


如果你实际上不是指WebSocket,而是指通过internet访问的TCP套接字,那么忽略我所说的一切;TcpListener应该没问题。

编辑:最初,这个问题是专门针对WebSocket提出的;下面的所有内容都基于该位置(现已删除)

WebSocket,RFC6455,不是一个裸套接字-它是一个非平凡的基于帧的协议,在转换到另一个协议之前类似于HTTP 1.1。所以如果你想使用WebSocket,你可能会想使用一个WebSocket服务器实现——我知道,手工操作并不有趣,相信我

如果你想要简单,ASP.NET包括ASP.NET核心和Kestrel有一个内置的WebSocket API,很简单

然而!因为它是基于帧的协议,所以您不会使用常规流。WebSocket有两种主要的数据帧类型:文本和二进制如果我们忽略早期只有文本的WebSocket原型,它基本上是一种不同的协议,对名称进行着色-显然,在您的情况下,您需要二进制,您最好的选择可能是更改现有代码以保存到MemoryStream,然后从MemoryStream获取缓冲区以传递给WebSocket API。最简单的方法是在MemoryStream上排列,但更有效的方法是使用GetBuffer或TryGetBuffer,并使用一个API,该API接受偏移量通常为0且长度为intmemoryStream.length的超大缓冲区


如果你实际上不是指WebSocket,而是指通过internet访问的TCP套接字,那么忽略我所说的一切;TcpListener应该没事。

谢谢你的提示。我实际上是一名Java开发人员,需要为这个特定的摄像头使用C。目标是通过流提供图像,以便python客户机能够获取图像。但是你的回答对于澄清非常有用:@ItFreak顺便说一句,几年前我为堆栈溢出编写了一个自定义web套接字客户端/服务器实现,我们称之为NetGain-它是-然而,在过去的几个月里,我们已经切换到.NET中基于Kestrel/libuv的web套接字服务器Core@ItFreak流和WebSocket之间有着巨大的区别;如果您实际上不需要WebSocket,我会说:不要使用TCP。通常,当我们谈论WebSocket时,我们谈论的是浏览器客户端。非常感谢!我将只使用TCPnow@ItFreakK不过,作为旁注;IIRC许多图像编码器需要搜索流,这是NetworkStream不允许的;在这种情况下,您可能再次希望使用MemoryStream作为原始存储来调用。Save。。。使用,然后只需倒回流内存stream.Position=0;并将内容从MemoryStream复制到NetworkStream-MemoryStream.CopyToNetworkStream感谢您的提示。我实际上是一名Java开发人员,需要为这个特定的摄像头使用C。目标是通过流提供图像,以便python客户机能够获取图像。但你的回答对澄清很有用
关于:@ItFreak顺便说一句,几年前我为堆栈溢出编写了一个自定义web套接字客户端/服务器实现,我们称之为NetGain-它是-然而,在过去的几个月里,我们在.NET中切换到了基于Kestrel/libuv的web套接字服务器Core@ItFreak流和WebSocket之间有着巨大的区别;如果您实际上不需要WebSocket,我会说:不要使用TCP。通常,当我们谈论WebSocket时,我们谈论的是浏览器客户端。非常感谢!我将只使用TCPnow@ItFreakK不过,作为旁注;IIRC许多图像编码器需要搜索流,这是NetworkStream不允许的;在这种情况下,您可能再次希望使用MemoryStream作为原始存储来调用。Save。。。使用,然后只需倒回流内存stream.Position=0;并将内容从MemoryStream复制到NetworkStream-MemoryStream.CopyTonetworkStream