【问题标题】:Read and write via Object Stream通过对象流读写
【发布时间】:2014-11-10 16:28:57
【问题描述】:

我有一个通过套接字连接的客户端/服务器。 客户端写入要由服务器读取的整数值 我在ObjectOutputStream 中使用readInt() 来写这个值 在服务器端,我在ObjectInputStream 中使用readInt() 来读取这个值。 但是服务器没有读取任何内容,它冻结在readInt() 使用ObjectInputStream阅读有什么问题? 我用的是DataOutputStream,读写成功,但是ObjectInputstream可以读取整数等原始类型,有什么问题?

public class Server {
ServerSocket listener;
private static final int PORT = 9001;
private Socket socket;
private ObjectInputStream obin = null;
private ObjectOutputStream obout = null;
public Server() throws Exception{
    listener = new ServerSocket(PORT);
    run();
}
public void run() throws Exception{
    socket = listener.accept();
    obout = new ObjectOutputStream(socket.getOutputStream());
    obout.flush();
    obin = new ObjectInputStream(socket.getInputStream());
    int h=obin.readInt();
    System.out.println(h);
    obout.writeInt(77); 
}
 public static void main(String[] args) throws Exception {
        Server s = new Server();
    }
 }

和客户

public class Client {
 private ObjectInputStream oin = null;
 private ObjectOutputStream oot = null;
 private Socket socket = null;
 public Client() throws Exception{
    String serverAddress = "127.0.0.1";
    socket = new Socket(serverAddress, 9001);
    oot = new ObjectOutputStream(socket.getOutputStream());
    oot.flush();
    oin = new ObjectInputStream(socket.getInputStream());
    oot.writeInt(66);
    int u = oin.readInt();
    System.out.println(u);
}
public static void main(String[] args) throws Exception{
    Client c= new Client();
}
}

当您运行此代码时,应该会到达服务器 66 在客户端 77, 但实际上我什么也没得到。为什么?

【问题讨论】:

  • 为什么在写入之前而不是之后刷新输出流?

标签: java sockets client-server


【解决方案1】:

每次写入后,您都应该使用 flush(),因为它会清除通过网络发送字节的输出缓冲区。所以你的服务器运行方法应该是:

public void run() throws Exception {
    socket = listener.accept();

    obin = new ObjectInputStream(socket.getInputStream());
    int h = obin.readInt();
    System.out.println(h);

    obout = new ObjectOutputStream(socket.getOutputStream());
    obout.writeInt(77);
    obout.flush();
}

和您的客户端构造函数:

public Client() throws Exception {
    String serverAddress = "127.0.0.1";
    socket = new Socket(serverAddress, 9001);

    oot = new ObjectOutputStream(socket.getOutputStream());
    oot.writeInt(66);
    oot.flush();

    oin = new ObjectInputStream(socket.getInputStream());
    int u = oin.readInt();
    System.out.println(u);
}

如果您将此作为练习进行,那很好,但如果您要在生产环境中运行基于此的代码,请考虑使用更高级别的网络库,例如 protocol buffers

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多