我使用C#制作文件传输程序。我写过服务器和客户端程序。现在我想做一些额外的事情。我想发送用户的卷号(例如:1,2,3等)以及客户端程序中将在服务器端接收的IP地址。我该怎么做?我的示例客户端程序代码如下:
document.ready
我需要添加哪些其他内容?
答案 0 :(得分:1)
正如OSI Model建议的那样,TCP
仅负责transport
/ session
级别的沟通,以便实现您的之间的完整沟通客户以及您的服务器,您需要在TCP
通讯上定义自己的适用协议。
为此你需要做一些事情:
serialization
/ de-serialization
和encryption
/ decryption
-
BinaryFormatter
或编写自己的序列化程序,您可以序列化为二进制数据,XML,JSON或您希望的任何其他格式但您应该 让序列化程序处理此问题,而不是像您刚才那样在您的应用程序代码中执行 。Application Layer
将负责数据的对象表示,并允许您抽象地更改数据,而无需更改通信层(通过实现匹配objects
和classes
使用)
这样,如果您需要在不更改整个模型和设计的情况下(例如,重置滚动消息等),您将能够创建新的消息类型。
答案 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等工业低级协议)。