使用套接字发送和接收数据

2022-09-01 07:19:13

我正在使用套接字来连接我的Android应用程序(客户端)和Java后端服务器。从客户端,我希望每次与服务器通信时发送两个数据变量。

1)某种消息(由用户通过界面定义)

2)消息的语言(由用户通过界面定义)

如何发送这些内容,以便服务器将每个内容解释为单独的实体?

在阅读了服务器端的数据并得出了适当的结论之后,我想向客户端返回一条消息。(我想我会接受这个)

所以我的两个问题是,如何确定发送的两个字符串(客户端到服务器)在客户端是唯一的,以及如何在服务器端分离这两个字符串。(我正在考虑一个字符串数组,但无法确定这是否可能或合适。

我打算发布一些代码,但我不确定这会有什么帮助。


答案 1

我假设您正在使用TCP套接字进行客户端 - 服务器交互?将不同类型的数据发送到服务器并使其能够区分两者的一种方法是将第一个字节(如果消息类型超过256种,则更多)专用于某种标识符。如果第一个字节是 1,则它是消息 A,如果它是 2,则是消息 B。通过套接字发送此内容的一种简单方法是使用:DataOutputStream/DataInputStream

客户:

Socket socket = ...; // Create and connect the socket
DataOutputStream dOut = new DataOutputStream(socket.getOutputStream());

// Send first message
dOut.writeByte(1);
dOut.writeUTF("This is the first type of message.");
dOut.flush(); // Send off the data

// Send the second message
dOut.writeByte(2);
dOut.writeUTF("This is the second type of message.");
dOut.flush(); // Send off the data

// Send the third message
dOut.writeByte(3);
dOut.writeUTF("This is the third type of message (Part 1).");
dOut.writeUTF("This is the third type of message (Part 2).");
dOut.flush(); // Send off the data

// Send the exit message
dOut.writeByte(-1);
dOut.flush();

dOut.close();

服务器:

Socket socket = ... // Set up receive socket
DataInputStream dIn = new DataInputStream(socket.getInputStream());

boolean done = false;
while(!done) {
  byte messageType = dIn.readByte();

  switch(messageType)
  {
  case 1: // Type A
    System.out.println("Message A: " + dIn.readUTF());
    break;
  case 2: // Type B
    System.out.println("Message B: " + dIn.readUTF());
    break;
  case 3: // Type C
    System.out.println("Message C [1]: " + dIn.readUTF());
    System.out.println("Message C [2]: " + dIn.readUTF());
    break;
  default:
    done = true;
  }
}

dIn.close();

显然,您可以发送各种数据,而不仅仅是字节和字符串(UTF)。

请注意,写入修改后的 UTF-8 格式,前面是无符号的双字节编码整数的长度指示符,为您提供要发送的字节。这样就可以找到编码字符串的结尾。如果您决定自己的记录结构,则应确保记录的结尾和类型是已知的或可检测的。writeUTF2^16 - 1 = 65535readUTF


答案 2

最简单的方法是将套接字包装在 ObjectInput/OutputStreams 中,并发送序列化的 java 对象。您可以创建包含相关数据的类,然后您无需担心处理二进制协议的细节。只需确保在写入每个对象“消息”后刷新对象流即可。


推荐