c# - 如何在 C# -> Java (Android) 之间进行套接字编程

标签 c# java android sockets

我最近开发了一款适用于 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/

相关文章:

java - 在java中向日期对象添加以小时为单位的时间?

java - 如何获取Java中的所有枚举值?

java - 获取特定值的数组索引

java - Android 中未处理异常

c# - 两个私有(private)子类到一个公共(public)类

c# - 比较器中的方法解析

c# - 什么是 DateRange 类的好 hashCode

c# - 将 excel 文件上传到数据库,但有些列变为空

java - 在移动到下一个方法之前等待内联线程完成

android - 如何从微调器适配器获取位置?