文件传输套接字编程

3

我正在使用C#编写文件传输程序。我已经编写了服务器和客户端程序。现在我想做一些额外的事情。我想在客户端程序中发送用户的卷号(例如:1、2、3等)和IP地址,这些信息将在服务器端接收。我该怎么做?下面是我的示例客户端程序代码:

class Program
{
    static void Main(string[] args)
    {
        try
        {    
            string roll ="1";
            string fileName = @"D:\demo.txt";
            TcpClient tcpClient = new TcpClient("127.0.0.1", 1234);
            Console.WriteLine("Connected. Sending file.");
            StreamWriter sWriter = new StreamWriter(tcpClient.GetStream());                
            byte[] bytes = File.ReadAllBytes(fileName);
            sWriter.WriteLine(bytes.Length.ToString());
            sWriter.Flush();
            sWriter.WriteLine(fileName);
            sWriter.Flush();
            Console.WriteLine("Sending file");
            tcpClient.Client.SendFile(fileName);
        }
        catch (Exception e)
        {
            Console.Write(e.Message);
        }

        Console.Read();
    }
}

我需要添加什么额外的东西?

1
创建您自己的数据包。 - kevintjuh93
1
你需要设计一个协议,也就是一种传递数据的格式,然后实现它。 - Alex K.
@Axs请展示您的接收器代码。 - Slashy
2
这些赞是因为“哇,酷,套接字”吗?你需要进行一些研究,并实现一个应用程序协议。 - CodeCaster
你可以使用第三方库吗? - code4life
你不使用现有的协议(如ftp、http push、bits等)有什么原因吗?如果你确实需要自己编写,为什么不使用启用流的WCF服务进行托管(而不是使用原始套接字)? - Steve B
2个回答

1
作为OSI模型所建议的,TCP仅负责通信的传输/会话级别,为了在您的客户端服务器之间实现完整的通信,您需要在TCP通信上定义自己的应用程序协议

为此,您需要一些东西:

  • 展示层将负责数据的序列化/反序列化加密/解密-
    • 为此,您可以使用BinaryFormatter或编写自己的序列化程序,您可以序列化为二进制数据、XML、JSON或任何其他格式,但您应该想要让序列化程序处理这个问题,而不是在您的应用程序代码中执行它
  • 应用层将负责数据的对象表示,并允许您抽象地更改数据而无需更改通信层(通过实现匹配的对象
    • 创建一个文件表示类,其中包含:
      • 文件名。
      • 文件数据。
      • 卷号。
      • 任何其他应用数据,您可以自行决定。
这样,如果需要创建新的消息类型,您就可以在不更改整个模型和设计(例如,重置卷动消息等)的情况下完成。

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这样的工业低级协议)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接