Tcpclinet C#发送对象的最简单方法

但丁

我是C#的新手,我想知道,使用tcpClient发送对象的最简单方法是什么,迭代了以下代码,但抛出了一个错误的错误客户端代码:

TcpClient client = new TcpClient(ip, port);
StreamWriter writer = new StreamWriter(client.GetStream());
NetworkStream strm = client.GetStream();
BinaryFormatter formatter = new BinaryFormatter();
Transaction tx = new transaction();

string msg = string.Empty;

msg = "transaction";
writer.WriteLine(msg);
writer.Flush();

formatter.Serialize(strm,tx);

在接收端

服务器代码:

while(true){
TcpClient client = server.AcceptTcpClient();
IFormatter formatter = new BinaryFormatter();
NetworkStream strm = client.GetStream();
StreamReader reader = new StreamReader(client.GetStream());
string msg = string.Empty;
while (!((msg = reader.ReadLine()).Equals("exit"))){

Transaction tx = (Transaction)formatter.Deserialize(strm);

}

它在服务器上产生此错误

input stream is not a valid ibinary format intital content is :0c-02-00-00 .....

所以有人可以帮我吗,或者还有其他使用tcpclient发送对象的简单干净的方法吗?

马克·格雷韦尔

这里的潜在问题与混合两种不同的机制以读写流有关的方式有关,特别是:使用StreamReader 基于流的单独解析器。使用这样做也是一个坏主意StreamWriter,但是...我想您一定会避免的,尽管它仍然是一个坏主意。

这里问题StreamReader贪婪当您要求它发送一行时,它不会从流中逐字节读取以寻找\ror \n,而是从流中获取数据缓冲区,然后按要求对其进行处理这样,它假定它现在是流唯一所有者

所以; 当您这样做时:

while (!((msg = reader.ReadLine()).Equals("exit"))){
   Transaction tx = (Transaction)formatter.Deserialize(strm);
}

读取器消耗的不仅"transaction\r\n“-它消耗了这一行和后面的内容,还有一些未定义的字节数。”然后,当BinaryFormatter尝试读取流时,它发现自己在消息中途出现,并在火花中爆炸。

理想情况下,将自己限制为一种序列化机制含义:输StreamReader/StreamWriter 完全在这里。

如果我可以提出一个使用protobuf-net和继承的替代机制:

[ProtoContract]
[ProtoInclude(1, typeof(ShutdownMessage))]
[ProtoInclude(2, typeof(TransactionMessage))]
public abstract class MessageBase {} 

[ProtoContract]
public sealed class ShutdownMessage : MessageBase {}

[ProtoContract]
public sealed class TransactionMessage : MessageBase {
    // your data here
}

现在,您可以通过以下方式发送任意数量的邮件:

public void Send(MessageBase message) {
    Serializer.SerializeWithLengthPrefix(strm, message, PrefixStyle.Base128);
}

并通过以下方式接收任意数量的消息:

while (true) {
    var msg = Serializer.DeserializeWithLengthPrefix<MessageBase>(strm, PrefixStyle.Base128);
    if (msg is null || msg is ShutdownMessage) break; // all done
    switch (msg)
    {
        case TransactionMessage tx: ProcessTransaction(tx); break;
        // etc
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#解析简单XML属性的最简单方法

来自分类Dev

在QTcpSocket中连续发送XML数据的最简单方法

来自分类Dev

将死信发送回处理主题的最简单方法?

来自分类Dev

从Linux Server发送邮件的最简单方法

来自分类Dev

通过网络发送文件的最简单方法

来自分类Dev

“模拟”实现仅属性协议的对象的最简单方法

来自分类Dev

创建返回对象引用的成员函数的最简单方法

来自分类Dev

摆脱C#字符串中零宽度空间的最简单方法

来自分类Dev

就编码而言,序列化XML中特定C#类的最简单方法

来自分类Dev

C#:从INI中删除节及其键的最简单方法是什么

来自分类Dev

在二叉树c#中获取节点索引的最简单方法

来自分类Dev

C#:从INI中删除节及其键的最简单方法是什么

来自分类Dev

在DirectX 11(C ++)中画线的最简单方法是?

来自分类Dev

在C中使用默认参数的最简单方法

来自分类Dev

在SwiftUI中制作动态,可编辑的简单对象列表的最简单方法?

来自分类Dev

将电子邮件中的每个单词(文本文件)放入数组C#的最简单方法

来自分类Dev

在C#中使函数无阻塞/异步的简单方法?

来自分类Dev

从C#网站获取价值的简单方法

来自分类Dev

jq:基于对象值条件递归删除对象的最简单方法

来自分类Dev

jq:基于对象值条件递归删除对象的最简单方法

来自分类Dev

将IntelliJ android项目发送给我的同事的最简单方法?

来自分类Dev

通过命令行使用gmail发送单行邮件的最简单方法?

来自分类Dev

将文件发送到远程计算机的最简单方法是什么?

来自分类Dev

在 PHP 中使用参数数组发送 post 请求的最简单方法?

来自分类Dev

在Groovy中实现单方法接口的最简单方法?

来自分类Dev

当我们可以有数百个对象时,用C#初始化多实例实例及其属性的最简单方法是什么?

来自分类Dev

使用构造函数Javascript中的field方法提供对象的最简单方法

来自分类Dev

实现此效果的最简单方法?

来自分类Dev

创建包装函数的最简单方法?

Related 相关文章

  1. 1

    C#解析简单XML属性的最简单方法

  2. 2

    在QTcpSocket中连续发送XML数据的最简单方法

  3. 3

    将死信发送回处理主题的最简单方法?

  4. 4

    从Linux Server发送邮件的最简单方法

  5. 5

    通过网络发送文件的最简单方法

  6. 6

    “模拟”实现仅属性协议的对象的最简单方法

  7. 7

    创建返回对象引用的成员函数的最简单方法

  8. 8

    摆脱C#字符串中零宽度空间的最简单方法

  9. 9

    就编码而言,序列化XML中特定C#类的最简单方法

  10. 10

    C#:从INI中删除节及其键的最简单方法是什么

  11. 11

    在二叉树c#中获取节点索引的最简单方法

  12. 12

    C#:从INI中删除节及其键的最简单方法是什么

  13. 13

    在DirectX 11(C ++)中画线的最简单方法是?

  14. 14

    在C中使用默认参数的最简单方法

  15. 15

    在SwiftUI中制作动态,可编辑的简单对象列表的最简单方法?

  16. 16

    将电子邮件中的每个单词(文本文件)放入数组C#的最简单方法

  17. 17

    在C#中使函数无阻塞/异步的简单方法?

  18. 18

    从C#网站获取价值的简单方法

  19. 19

    jq:基于对象值条件递归删除对象的最简单方法

  20. 20

    jq:基于对象值条件递归删除对象的最简单方法

  21. 21

    将IntelliJ android项目发送给我的同事的最简单方法?

  22. 22

    通过命令行使用gmail发送单行邮件的最简单方法?

  23. 23

    将文件发送到远程计算机的最简单方法是什么?

  24. 24

    在 PHP 中使用参数数组发送 post 请求的最简单方法?

  25. 25

    在Groovy中实现单方法接口的最简单方法?

  26. 26

    当我们可以有数百个对象时,用C#初始化多实例实例及其属性的最简单方法是什么?

  27. 27

    使用构造函数Javascript中的field方法提供对象的最简单方法

  28. 28

    实现此效果的最简单方法?

  29. 29

    创建包装函数的最简单方法?

热门标签

归档