0

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

我用于文件,

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

对于 byte[] 对象

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

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

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,我将在其中写入标头,例如“...”,在服务器上我尝试找到此标头,剪切它,分析并做一些活动。

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

谢谢。

4

1 回答 1

0

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

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

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

于 2012-10-15T09:14:39.120 回答