在java中通过TCP发送数据记录

Posted

技术标签:

【中文标题】在java中通过TCP发送数据记录【英文标题】:Send a Data Record through TCP in java 【发布时间】:2013-07-13 18:31:47 【问题描述】:

我是一名 Delphi 开发人员,最近我决定将我的一个程序移植到 java,我正在用 java 做服务器端程序以使其跨平台。

在 Delphi 中,我可以通过 TCP 轻松地将记录作为字节数组发送,但我在 java 方面没有太多经验,也不知道如何以一种简单但适度的方式来完成。 这是我的数据记录示例:

type
  Tlogin = record
    username : string[50];
    password : string[50];
    version  : word;
  end;

我只是简单地把这种类型的记录做成一个字节数组后发送。

关于如何在 java 中制作此类数据记录以及如何设置字符串大小的任何想法,或者任何更好的建议来处理字符串以通过 TCP 发送它们。

【问题讨论】:

“有更好的建议来处理通过 TCP 发送的字符串吗?”。是的,XML、JSON 或 Web 服务,正如您对上一个问题 link 的回答所建议的那样。为什么需要序列化数据? 【参考方案1】:

在 Java 中,您只需通过客户端和服务器之间的套接字发送对象,有多种方法可以做到这一点。如需相关参考,请访问

Sending objects over Java sockets

如需更详细的分步示例,请访问以下链接:

JGuru - Sending objects over a socket

在您的情况下,您的对象如下所示

class TLogin implements Serializable


   private String userName;
   private String password;
   private int version;

   //implement your objects methods below



对象中不想参与序列化和反序列化的字段可以标记为transient

有关序列化的详细分步示例,请访问 Java Serialization Example

根据提供给我之前回复的评论进行编辑。

简单来说序列化:这是一种技术,其中 Java 对象被转换为字节序列(本质上,对象的所有字段,除了那些标记为瞬态的字段都是该字节序列的一部分)。然后可以使用此字节序列在稍后的时间点重新构造对象。通过序列化对象获得的字节序列可以保存到存储中,也可以通过网络通道传输,以便在稍后阶段重新构造对象。 序列化是 Java 客户端服务器环境中使用 RMI、套接字或 SOAP 发生的许多通信协议的核心。

说完了序列化,我们来看看客户端-服务器问题。 如果计划只是将服务器端代码移植到 Java,那么您可以使用以下选项来启用客户端和服务器之间的通信:

    设计服务器以使用 SOAP/REST 与 Delphi 客户端通信。 使用包含有关所存储数据的长度和类型信息的标头数据结构来扩充您的记录,并在服务器端的客户端传输字节序列中使用此标头来重建对象。

但是,在我看来,第一种方法比第二种方法更好,因为

    这是一种标准的互操作技术。如果以后您希望将客户端移植到 C# 或 Python 等其他语言,则无需更改服务器。 它允许 Web 服务基础架构处理 SOAP/REST 序列化,让您专注于业务逻辑

我希望这个冗长的答案可以为您指明解决方案的方向

【讨论】:

感谢您的重播,但是这种序列化实际上对数据有什么作用?因为我的客户端应用程序是用 delphi 编写的,我只打算将我的服务器移植到 java。在delphi中我需要知道字符串的大小才能读取并将其放入数据变量中,在java中它似乎是自动完成的,但在delphi中它不是

以上是关于在java中通过TCP发送数据记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C/C++ 中通过 TCP 发送 .mp4 文件?

如何在rails中通过tcp发送值?

在 C++ 中通过 tcp 套接字发送结构

《asyncio 系列》8. 在 asyncio 中通过流(StreamReaderStreamWriter)来实现 TCP 请求的发送与接收

如何修复 Java Web 应用程序中通过已发送数据的信息暴露漏洞

在PHP中通过TCP发送XML EPP请求