我有一个通过套接字连接的客户端/服务器。
客户端写入整数值以供服务器读取
我在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/