c# - 将二进制格式化程序与异步套接字一起使用

标签 c# sockets asynchronous binaryformatter

我试图利用 C# 中异步套接字的优势,通过 BinaryFormatter 进行序列化/反序列化,但遇到了一些问题。主要是,我不断收到错误:

没有对象 1953724755 的 map

当尝试反序列化网络流时。

我尝试更改为同步套接字,这似乎工作正常,但是当使用异步套接字(使用 BeginRecieve 和 EndRecieve 等)时,我仍然收到此错误。

这是我反序列化的代码:

private void BeginDictionaryRecieve(IAsyncResult ar)
{
    Stream socketStream = new NetworkStream(socketState.workSocket);
    IFormatter dataFormatter = new BinaryFormatter();
    socketState.workSocket.EndReceive(ar);
    List<string> rackthatWasClicked = (List<string>) 
        dataFormatter.Deserialize(socketStream);
    this.recievedListForRackDisplay = rackthatWasClicked;
    OnDataRecieved.Invoke();
    socketState.workSocket.BeginReceive(socketState.buffer, 0, StateObject.BufferSize, 0,new AsyncCallback(BeginDictionaryRecieve), socketState);
}

这是序列化代码(同步):

IPAddress ipAdd = IPAddress.Parse("127.0.0.1");
TcpClient myClient = new TcpClient();
myClient.Connect(ipAdd, 8002);
Stream clientStream = myClient.GetStream();
IFormatter f = new BinaryFormatter();
f.Serialize(clientStream, ShelfDataToSend);
clientStream.Dispose();
myClient.Dispose();

我应该注意,我正在使用 BinaryFormatter,因为我似乎找不到一种方法来序列化除字符串之外的对象,在套接字上进行正常的 .Write 操作。

最佳答案

感谢 Hans 的指导,我找到了一个效果很好的解决方案。我现在收到这样的数据:

try
{
    StateObject state = (StateObject) ar.AsyncState;
    Socket client = state.workSocket;

    int bytesRead = client.EndReceive(ar);

    if (bytesRead > 0)
    {
        stream.Write(state.buffer, 0, bytesRead);
        client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(BeginDictionaryRecieve), state);
    }
    else
    {
        if (stream.Length > 1)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            stream.Position = 0;
            this.recievedListForRackDisplay =(List<string>)formatter.Deserialize(stream);
            OnDataRecieved.Invoke();

            client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                            new AsyncCallback(BeginDictionaryRecieve), state);
        }
    }

}
catch (Exception e)
{
    throw e;
}

还应该注意的是,该解决方案仅在客户端 Socket 在发送数据后被释放的情况下才有效。

关于c# - 将二进制格式化程序与异步套接字一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56292522/

相关文章:

javascript - 嵌套回调异步运行

ios - 我将如何为我的 UITableView 设计一个异步图像下载器,它根据 TableView 中的位置确定下载的优先级?

c# - 将字符串值从 c#.net 传递给 javascript

c# - 初始化组件错误C#

C# 相当于此代码

java - "Address already in use"接收数据报中的DataramSocket

java - Executor框架和JMS等消息队列的区别

c# - Ms-Chart 标签格式问题

c - 使用 select 代替 fork

Java Socket与ServerSocket通信死锁