如何使用UDP或TCP(lua / Java)发送压缩数据

时间:2019-04-10 13:37:05

标签: java tcp lua udp luasocket

我正在用lua客户端和Java服务器制作服务器。 我需要压缩一些数据以减少数据流。

为此,我使用LibDeflate在客户端上压缩数据

public  void Configure(IApplicationBuilder app, IHostingEnvironment env, BooksContext booksContext)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseIdentityServer();
    app.UseMvc();
    app.UseSwagger();
    app.UseSwaggerUI(options =>
        options.SwaggerEndpoint("/swagger/v2/swagger.json", "Book Chapter Service"));
    app.UseDefaultFiles();
    app.UseStaticFiles();
}

在服务器上,我用它来接收数据包(TCP)

local config = {level = 1}
local compressed = LibDeflate:CompressDeflate(data, config)
UDP.send("21107"..compressed..serverVehicleID) -- Send data

我已经尝试使用UDP和TCP发送它,问题是相同的。 我尝试使用LibDeflate:CompressDeflate和LibDeflate:CompressZlib 我尝试调整配置 什么都不起作用:/

我希望收到一个包含整个字符串的数据包 但是我收到的数据包很少,每个数据包都包含压缩字符。示例(每行都是服务器认为他收到了一个新数据包): eclipse console when receiving compressed data http://image.noelshack.com/fichiers/2019/15/3/1554903043-annotation-2019-04-10-153025.jpg

2 个答案:

答案 0 :(得分:1)

经过大量研究,我终于设法解决了我的问题! 我用这个:

DataInputStream in = new DataInputStream(new BufferedInputStream(clientSocket.getInputStream()));

int count;
byte[] buffer = new byte[8192]; // or 4096, or more

while ((count = in.read(buffer)) > 0) {
    String data = new String(buffer, 0, count);
    Do something...
}

我仍然没有测试接收的压缩字符串是否有效,我将在尝试时更新我的​​帖子。

编辑:似乎可行

现在唯一的问题是,当数据包大于缓冲区大小时,我不知道该怎么办。 我希望有一种在每种情况下都可以使用的东西,并且由于某些数据包大于8192,它们被切成了两半。

答案 1 :(得分:0)

假设客户端发送一个压缩的“文档”,则服务器端代码应类似于以下内容(TCP版本):

is = new DeflaterInputStream(clientSocket.getInputStream());
in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String inputLine;

while ((inputLine = in.readLine()) != null) { 
    ...
}

以上内容未经测试,还需要异常处理和代码以确保流始终关闭。

诀窍在于,您的输入管道需要先解压缩数据流,然后再尝试将其作为文本行读取/处理。