以连续方式从 java 服务器发送数据

Sending data from a java server in a consecutive way

这是我的 java 服务器代码:

public class CaspSocket {

    private Socket socket = null;
    private PrintWriter out = null;
    private BufferedReader in = null;

    public CaspSocket(InetAddress caspAddress, int caspPort) throws IOException {
        socket = new Socket(caspAddress, caspPort);
        out = new PrintWriter(socket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }

我用"out"发送数据

out.print(1 + "|");
out.print(2 + "|");                                 
out.print(3 + "|");  

在GameMaker Studio中会收到如下:

var in_buff = ds_map_find_value(async_load, "buffer");
test_string=buffer_read(in_buff, buffer_string);

这样所有东西都会被放入一个字符串中

test_string="1|2|3|"

但是我想以连续的方式接收数据

var in_buff = ds_map_find_value(async_load, "buffer");
test_string=buffer_read(in_buff, buffer_string);
test_string2=buffer_read(in_buff, buffer_string);        
test_string3=buffer_read(in_buff, buffer_string); 

给予

test_string="1|" test_string2="2|" test_string3="3|"

如何以连续的方式从 java 服务器发送数据,以便可以在 GameMaker Studio

中使用 buffer_read(in_buff, buffer_string); 单独读取每个数据块

编辑: 我已经阅读了使用缓冲区部分,问题是当我使用以下命令将 GameMaker Studio 发送到服务器时:

buffer_seek(Buffer, buffer_seek_start, 0);
buffer_write(Buffer, buffer_string, string(1) + chr(10)); //chr(10) means new line    
buffer_write(Buffer, buffer_string, string(2) + chr(10));
buffer_write(Buffer, buffer_string, string(3) + chr(10));
network_send_raw(Socket, Buffer, buffer_tell(Buffer));

java服务器只会发回一个字符串:

var in_buff = ds_map_find_value(async_load, "buffer");    
buffer_read(in_buff, buffer_string);

我不知道如何使用 java 服务器按顺序发送,就像可以在 GM:S:

中接收一样
var in_buff = ds_map_find_value(async_load, "buffer");
test_string=buffer_read(in_buff, buffer_string);
test_string2=buffer_read(in_buff, buffer_string);        
test_string3=buffer_read(in_buff, buffer_string); 

我只会使用 buffer_string 让事情变得更简单。

套接字通信基于流的概念。流是简单的字节序列,您无法控制它们的发送方式。实际传输由 OS 协议驱动程序管理,无法从应用程序级别访问。所以基于多个条件

out.print(1 + "|");
// some other code
out.print(2 + "|");                                 
// some other code
out.print(3 + "|");

可能以单个数据包或多个数据包的形式交付。即使 flush() 方法也只会将数据推送到 OS 缓冲区,并且对实际交付没有任何保证。

因此,要按顺序阅读消息,您应该使用以太币

  1. 知道它们的大小并读入预期大小的缓冲区(您可以先发送某种 "header" 固定大小的数据,这将告诉 [= =19=]"body"下一个数据,然后下一个"header"等等)
  2. 阅读完整的可用内容并在您的客户端应用程序中使用数据分隔符将其拆分(在您的情况下,这似乎是 | 个字符)