文件传输套接字编程

时间:2015-09-25 11:33:28

标签: c# .net

我使用C#制作文件传输程序。我写过服务器和客户端程序。现在我想做一些额外的事情。我想发送用户的卷号(例如:1,2,3等)以及客户端程序中将在服务器端接收的IP地址。我该怎么做?我的示例客户端程序代码如下:

document.ready

我需要添加哪些其他内容?

2 个答案:

答案 0 :(得分:1)

正如OSI Model建议的那样,TCP仅负责transport / session级别的沟通,以便实现您的之间的完整沟通客户以及您的服务器,您需要在TCP通讯上定义自己的适用协议

为此你需要做一些事情:

  • Presentation Layer将负责数据的serialization / de-serializationencryption / decryption -
    • 为此您可以使用BinaryFormatter或编写自己的序列化程序,您可以序列化为二进制数据,XML,JSON或您希望的任何其他格式但您应该 让序列化程序处理此问题,而不是像您刚才那样在您的应用程序代码中执行
  • Application Layer将负责数据的对象表示,并允许您抽象地更改数据,而无需更改通信层(通过实现匹配objectsclasses使用)
    • 创建一个包含以下内容的文件表示类:
      • 文件名。
      • 档案数据。
      • 卷号。
      • 您希望的任何其他应用数据。

这样,如果您需要在不更改整个模型和设计的情况下(例如,重置滚动消息等),您将能够创建新的消息类型。

答案 1 :(得分:0)

您可以设计一个小协议。这是一个基本的例子,可以给出如何开始的想法。我们假设我们要发送float值:

using (BinaryWriter writer = new BinaryWriter(sWriter, Encoding.UTF8))
{
    var floatValue = 23.4F;
    var bytes = new List<byte>();
    bytes.Add(0x03) // type of message: float
    bytes.Add(BitConverter.GetBytes(floatValue)); // 4 bytes of float
    writer.Write(bytes.ToArray());
}

另一方面,你会解释这样的信息:

switch (receivedArray[0])
    case 0x03: return BitConverter.ToSingle(receivedArray, 1);
               break;

但是,您可能希望支持更多类型的数据,可能还需要支持整个对象等。您可能希望扩展支持的数据类型,以引入可变长度字符串等。

using (BinaryWriter writer = new BinaryWriter(sWriter, Encoding.UTF8))
{
    var bytes = new List<byte>();
    var floatValue = 23.4F;
    var ip = "192.168.111"
    var stringBytes = Encoding.ASCII.GetBytes(string);
    bytes.Add(0x03) // type of message: string
    bytes.Add(BitConverter.GetBytes(stringBytes.Length)); // 8 bytes with length
    bytes.AddRange(stringBytes); // entire string
    writer.Write(bytes.ToArray());
}

对于高级场景,您应该考虑使用Protobuf或其他序列化框架,这样可以更轻松地使用对象来处理数据而不是原始浮点数和字符串(这适用于Modbus等工业低级协议)。