java - TCP Socket 交换 kryo 序列化对象

标签 java sockets kryo

我目前正在开发一个通过 TCP 套接字发送/接收对象的项目。我选择使用 Kryo 序列化框架,因为它是最流行的框架之一。我看到对于网络通信,建议使用KryoNet,但出于我自己的原因,我选择使用我自己的TCP Socket框架(主要是因为我想在我的项目中自定义控制TCP流和线程)。我遇到的问题是我为消息创建了以下类:

public class MyMessage {

    public HashMap<String, String> _values;

    public MyMessage() {
        _values = new HashMap<String, String>();
    }
}

在服务器端,我有以下代码用于从 TCP 套接字读取输入:

import java.io.*;
import java.net.*;

public class MyServer {

    private ServerSocket _serverSocket;

    private Integer _serverPort;

    private boolean _killCommand;

    public MyServer() {
        _serverSocket = null;
        _serverPort = -1;
        try {
            _serverSocket = new ServerSocket(0);
            _serverPort = _serverSocket.getLocalPort();
            System.out.println("server started on IP: " + _serverSocket.getInetAddress().getHostAddress() + ":" + _serverPort);
        } catch (IOException e) {
            e.printStackTrace();
        }
        _killCommand = false;
    }

    public void runServer() {
        Socket _client= null;
        while(_killCommand == false) {
            try {
                _client = _serverSocket.accept();
                _out = _client.getOutputStream();
                _in = _client.getInputStream();
                (new Thread(new ServerThread(_in, _out))).start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

ServerThread 类:

import java.io.*;
import java.util.HashMap;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.*;

public class ServerThread implements Runnable {

    private InputStream _in;

    private OutputStream _out;

    private Kryo kryo;

    private Input _input;

    private Output _output;

    public SynEFOthread(InputStream in, OutputStream out) {
        _in = in;
        _out = out;
        kryo = new Kryo();
        _output = new Output(_out);
        _input = new Input(_in);
    }

    @Override
    public void run() {
        MyMessage msg = null;
        System.out.println("Thread worker: about to parse input message");
        msg = kryo.readObject(_input, MyMessage.class);
        }
    }
}

另一方面,客户端代码如下:

import java.io.*;
import java.net.Socket;
import java.util.*;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.*;

public class MyClient {

    public static void main(String[] args) throws Exception {
        String server_ip = "";
        Integer server_port = -1;

        server_ip = args[0];
        server_port = Integer.parseInt(args[1]);

        Socket serverSocket = new Socket(server_ip, server_port);
        OutputStream _out = serverSocket.getOutputStream();
        InputStream _in = serverSocket.getInputStream();
        Output _output = new Output(_out);
        Input _input = new Input(_in);
        MyMessage msg = new MyMessage();
        msg._values = new HashMap<String, String>();
        msg._values.put("TASK_TYPE", "TOPOLOGY");
        Kryo kryo = new Kryo();
        kryo.writeObject(_output, msg);
        Thread.sleep(100);
        kryo.writeObject(_output, _msg);
        String _ack = kryo.readObject(_input, String.class);
        serverSocket.close();
    }
}

问题在于,在 ServerThread.run() 函数上,kryo.readObject() 调用会阻塞,之后不会执行任何操作。难道我做错了什么?我是否正确打开流以与 Kryo 序列化框架一起使用?

最佳答案

  1. 在客户端和服务器端使用 kryo.register(MyMessage.class) 注册您的类。
  2. 为序列化/反序列化代码创建测试,但使用 ByteArrayOutputStream/ByteArrayInputStream 代替套接字。
  3. 冲水!将完整消息写入流后,将写入的字节刷新到网络:_output.flush()

关于java - TCP Socket 交换 kryo 序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26386220/

相关文章:

java - 需要向 JFrame 添加文本

java - 如何在Swing的JTextArea中执行正则表达式

java - Servlet/JSP 流程控制 : Enums, 异常,还是其他原因?

.net - 本地主机和127.0.0.1不一样吗?

java - 使用 Kryo 反序列化包含一些不可反序列化对象的数组(抢救可反序列化部分)

java - 从测试期间抛出的异常中获取自定义属性

c - SO_BINDTODEVICE Linux 套接字选项的问题

java - 为什么来自BluetoothSocket的输入/输出流被评估为NOT null,然后抛出空指针异常?

serialization - 如何在 Apache Spark 中向 Kryo Serializer 注册类?

java - 将 kryo 对象存储在已编译的 jar 中?