【问题标题】:Sending data from a java server in a consecutive way以连续方式从 java 服务器发送数据
【发布时间】:2017-10-23 16:24:54
【问题描述】:

这是我的 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 让事情变得更简单。

【问题讨论】:

    标签: java gml


    【解决方案1】:

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

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

    可以在单个数据包或多个数据包中交付。甚至flush() 方法也只会将数据推送到操作系统缓冲区,而对实际交付一无所知。

    所以要按顺序阅读消息,你应该以太

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

    【讨论】:

    • 谢谢!我之前尝试过方法2,因为我对java不是很有经验。在 GameMaker Studio 中,将完整内容存储在一个变量中并将其拆分,但是在执行此操作时,可能会接收其他数据并将其存储在同一变量中,从而导致数据混合。在这种情况下,方法 1 应该使用哪个 java 代码?
    • 请查看Using Buffers,了解如何发送和读取数据。
    • 与 #2 一起使用,您可以使用集中式阅读器,稍后根据内容在您的应用中分发收到的消息。
    • 谢谢,但是我不知道使用方法1的java代码应该是什么样子。至于方法2我不明白你的意思是分发消息,你能解释一下吗请问详细点?我使用 switch 语句来确定要处理的事件类型,但是当客户端收到包含以下内容的数据包时:“1|2|3|4|”然而,当它收到另一个包时,它正在被拆分:“5|2|3|8”之前的数据在被拆分时被覆盖。因为接收到的数据存储在单个变量中,
    • 在这一点上我能给你的最好建议是花一些时间进行自学。查看这篇文章(它在 JS 中,但应该让您对这个概念有一个大致的了解):gamedevelopment.tutsplus.com/tutorials/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2020-05-01
    • 2016-01-06
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多