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

时间:2017-10-23 16:24:55

标签: java gml

这是我的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来简化操作。

1 个答案:

答案 0 :(得分:0)

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

flush()

可以在单个数据包或多个数据包中传送。即使|方法也只是将数据推送到OS缓冲区,并且不保证实际交付。

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

  1. 了解它们的大小并读入预期大小的缓冲区(您可以首先发送某种固定大小数据的“标题”,这将告诉“body”的大小数据接下来,然后是下一个“header”等等)
  2. 阅读完整的可用内容并使用数据分隔符将其拆分到您的客户端应用中(您的情况似乎是{{1}}字符)