【问题标题】:How to receive/send file, data on .net(C#) Sockets and distinguish them如何在.net(C#)套接字上接收/发送文件、数据并区分它们
【发布时间】:2012-10-15 09:10:30
【问题描述】:

我在 .net 套接字上有异步服务器和异步客户端。 客户端创建对象(例如类 UserInfo),序列化他,并写入 byte[]。 客户端也有一些文件(例如 1.png)。 客户端需要将序列化的 UserInfo 和 1.png 发送到服务器。

我用于文件,

Socket.BeginSendFile 方法(字符串、AsyncCallback、对象)

对于字节[] 对象

client.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), 客户端);

服务器必须一起接收这个日期,并了解什么是文件,什么是序列化对象(因为服务器只有一种接收数据的方法)。

listener.BeginAccept(
new AsyncCallback(AcceptCallback),
listener);
...
AcceptCallback(IAsyncResult ar)
{...
 handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                new AsyncCallback(ReadCallback), state);
}

以及我们的逻辑

ReadCallback(IAsyncResult ar)
    {...}

如何正确接收这些数据?最后,我需要该服务器具有 1.png 和 UserInfo 对象。(并区分它们)。而且,由于服务器是异步的,所以在同时接收来自多个客户端的数据时不应该混淆

我有一个想法,但我认为这是错误的: 尝试在客户端上使用

Socket.BeginSendFile 方法(String、Byte[]、Byte[]、TransmitFileOptions、AsyncCallback、Object)

使用 byte[] preBuffer,我将在其中写入标头,例如“...” 在服务器上,我尝试找到这个标头,剪切它,分析并做一些活动。

有没有更简单更正确的方法?

谢谢。

【问题讨论】:

    标签: c# .net file sockets asynchronous


    【解决方案1】:

    就实现而言,每个通道(套接字)都应具有明确且已知的协议 - 众所周知的对象类型。所以引入一个主类,它将封装所有可以通过这个套接字发送的数据:

    public interface IPacketWrapper
    {
       IEnumerable<byte> Payload { get; }
       UserInfo UserDetails { get; }
    }
    

    因此客户端和服务器通过实现IPacketWrapper的对象进行交换,因此您可以将二进制数据和UserInfo放在一起,然后分别在客户端/服务器端序列化/反序列化此对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 2012-09-23
      • 1970-01-01
      • 2013-02-16
      相关资源
      最近更新 更多