java - 通过对象流读写

标签 java sockets client-server

我有一个通过套接字连接的客户端/服务器。 客户端写入整数值以供服务器读取 我在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, 但实际上我什么也没得到。为什么?

最佳答案

每次写入后,您应该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 .

关于java - 通过对象流读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26848376/

相关文章:

java - Android,退出/暂停应用程序,如何销毁线程

objective-c - Cocoa Objective-C 主循环

c - 服务器端套接字陷入无限循环

c - 在linux环境下模拟不同IP地址的不同PC

java - 航位推算 - 客户端/服务器游戏 - 如何处理击键

mysql - 如何在 PhoneGap 中连接到客户端服务器数据库?

java - JPQL 可以检索没有引用记录的记录吗?

java - 实例化一个类并让它完成工作的最佳方法是什么

java - 使用Struts2 + Freemarker生成大文件

java - 当我在 Android Studio 的菜单中说添加地点时,它有时会打开 map ,有时应用程序会在不打开的情况下关闭