我最近开发了一款适用于 Windows 和 Android 的服务器/客户端应用程序,它允许人们通过套接字连接将文件从 Windows 发送到 Android 手机。
它对于单个文件非常有效,但尝试在单个流中发送多个文件会给我带来问题。我还意识到,除了二进制数据之外,我还需要通过套接字发送消息来指示错误状态和其他应用程序消息。我对网络编程缺乏经验,并且想知道什么是最好的前进方向。
基本上,应用程序的 C# 服务器端只是进入监听状态并使用 Socket.SendFile 来传输文件。在 Android 上,我使用标准 Java Socket.getInputStream() 来接收文件。这对于单个文件传输非常有用,但是我应该如何处理多个文件和错误/消息信息?我需要为每个文件使用不同的套接字吗?我应该使用更高级别的框架来处理这个问题,还是可以通过单个套接字发送所有内容?对于框架或学习 Material 还有其他建议吗?
最佳答案
基本上,您必须定义某种数据传输协议(protocol)。您可以尝试查找现有协议(protocol)或定义自己的协议(protocol)。现在你的协议(protocol)定义如下:
- 客户端连接到服务器
- 服务器发送文件内容并终止连接
- 客户端接收文件内容,直到连接终止
通过 TCP 套接字进行通信意味着通常您必须将连接视为双向字节流。设计协议(protocol)的最佳方法是让它描述将要发送的内容,以便接收方知道会发生什么。
为了解决您的问题,您的协议(protocol)可能如下所示:
- 客户端连接到服务器
- 服务器发送它将传输的文件数量(作为 4 字节整数),
- 客户端接收它将接收的文件数量(作为 4 字节整数),
- 服务器发送第一个文件的大小(作为 4 字节整数 - 但这会将最大文件大小限制为 4GB)
- 客户端接收第一个文件的大小
- 服务器发送第一个文件的内容
- 客户端接收第一个文件的内容 - 它从 TCP 流中准确读取字节数作为第一个文件的大小,
- 服务器发送第二个文件的大小
- ...
- 发送完所有文件后,服务器关闭连接
- 客户端收到最后一个文件后,等待服务器关闭连接并关闭连接
您可以通过发送文件名(前面带有文件名长度)或一些确认或错误代码来丰富这个简单的协议(protocol)。您可以以 n 字节 block 的形式发送文件内容,每个 block 后面都有一个校验和,客户端必须验证该校验和。您的想象力是唯一的限制。
关于c# - 如何在 C# -> Java (Android) 之间进行套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2793542/