【问题标题】:Sending a packet header and body发送数据包头和正文
【发布时间】:2017-09-08 06:14:47
【问题描述】:

目前,我的服务器和客户端使用如下所示的请求字符串进行通信:

[...]
this.outputStream = new PrintWriter(this.socket.getOutputStream(), true);
    this.inputStream = new BufferedReader(new 
InputStreamReader(this.socket.getInputStream()));
[...]

连接Server的Socket代表socket,来自Server Socket的openConnection()。我正在通过一种方法使用 Socket 发送客户端请求字符串:

public void sendRequest(String requestString) {
    this.outputStream.println(requestString);
}

对此的限制是我的服务器和客户端永远不知道正在发送什么类型的请求,我设法稍微能够确定正在发送的内容的唯一方法是在数据之前发送一个事件值,例如所以:

public final static int DEFAULT = 1; 公共最终静态 int 登录 = 2; 等等……

因此 Socket 包含客户端当前所在的 ID,因此服务器知道下一组信息对应于服务器操作登录。

有没有办法通过套接字发送数据包,其中标头可以是 2,数据是用户名和密码?

感谢所有帮助,我通过套接字查看了对象,但您似乎需要知道传入的对象类型。

【问题讨论】:

  • 为什么不发送 JSON
  • 是否有资源或库可以做到这一点@ScaryWombat
  • 不确定我是否理解您的问题。您不能创建一个“MyPacket”类,例如,它有两个字段 - 一个类型字段(您的 DEFAULT、LOGIN 等常量)和一个内容字段。后者将属于与类型相对应的类。例如,对于 LOGIN,它将是“Credentials”类的一个实例,包含两个字符串字段。您可以使用 ObjectOutput/InputStreams 来编组对象。
  • +1 到 Scary Wombat 在套接字或任何其他介质上发送对象紧密耦合服务器与客户端。而使用主要用于此目的的 JSON 或 XML 将 #1 将服务器与客户端解耦 #2 使用 Jackson 或 JAX-B 等库,您可以将 json 或 xml 转换为等效对象。
  • 安全方面,你应该在服务器上维护会话状态,否则我可能会发送一个数据包说我已登录并想要运行命令,如果服务器不知道否则它可能会让我运行命令,无需登录

标签: java sockets


【解决方案1】:

这取决于您如何设计服务器和客户端之间的应用程序级协议。例如,您可以在打开套接字后从客户端写入一个字符串,该字符串看起来像“LOGIN \n”,然后是序列化对象。从服务器端您可以读取它直到行尾字符,然后解释“LOGIN”字符串,然后读取对象。

您也可以按照上面的建议使用 JSON。

但是,无论您决定什么,您都必须首先在客户端和服务器之间定义和建立应用程序级协议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2020-08-16
    • 2013-03-30
    • 2021-01-05
    • 2012-10-03
    • 2012-05-20
    • 2011-05-30
    相关资源
    最近更新 更多