java - 通过套接字发送对象

标签 java sockets client-server

我想通过套接字发送 x 对象,但是当我运行这段代码时,我什么也没有得到。 它停在 new ObjectInputStream(socket.getInputStream()) 并且不要做任何其他事情。

服务器类别:

public class Server {
private static final int PORT = 9001;
ServerSocket listener;
private Handler h[] = new Handler[5];
private int clientCount = 0;
public Server() throws Exception{
    System.out.println("The server is running.");
    listener = new ServerSocket(PORT);
    run();
}
public void run(){
    while (true) {
        try {
            addClient(listener.accept());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  private void addClient(Socket socket) throws Exception{
    h[clientCount] = new Handler(this, socket,clientCount);
    h[clientCount].open(); 
    clientCount++;

}
public static void main(String[] args) throws Exception {
    Server s = new Server();

}
}

处理程序类//处理类:

public class Handler extends Thread {
private Server  server;
private Socket socket;
private int ID = -1;
private ObjectInputStream obIn = null;
private ObjectOutputStream obOut = null;
public Handler(Server _server, Socket _socket, int i){
    super();
      server = _server;
      socket = _socket;
      ID     = i;
}
 public void open() 
   {  
      try {
          obIn = new ObjectInputStream(socket.getInputStream());
      obOut = new ObjectOutputStream(socket.getOutputStream());
      x= ob.readObject();
    } catch (Exception e) {
          e.printStackTrace();
    }   
   }
}

客户端:

public class Client  {
ObjectInputStream oin;
ObjectOutputStream oot;
private Socket socket = null;
public Client() {
    String serverAddress = "127.0.0.1";
    try {
     socket = new Socket(serverAddress, 9001);
        oin = new ObjectInputStream(socket.getInputStream());
        oot = new ObjectOutputStream(socket.getOutputStream());
        System.out.println("hello i am a client");
        oot.writeObject(x);
    } catch (Exception e) {
    e.printStackTrace();
    }
}
public static void main(String[] args) throws Exception {
    Client client = new Client();
}
}

最佳答案

您必须在声明 ObjectInputStream 之前声明 ObjectOutputStream

当您创建ObjectInputStream时,它会等待来自ObjectOutputStream的数据。它正在等待该数据( header )。

public ObjectInputStream(InputStream in) throws IOException {
     verifySubclass();
     bin = new BlockDataInputStream(in);
     handles = new HandleTable(10);
     vlist = new ValidationList();
     enableOverride = false;
     readStreamHeader(); //this is whats causing it to block
     bin.setBlockDataMode(true);
}


protected void readStreamHeader() throws IOException, StreamCorruptedException {
     short s0 = bin.readShort();
     short s1 = bin.readShort();
     if (s0 != STREAM_MAGIC || s1 != STREAM_VERSION) {
          throw new StreamCorruptedException(String.format("invalid stream header: %04X%04X", s0, s1));
     }
}

如果您首先声明ObjectOutputStream,它会发送数据,这不会阻塞

关于java - 通过套接字发送对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26824825/

相关文章:

java - 如何在工作台透视图中将多个 View 添加到一个选项卡组中?

java - 在调整大小时缩放地址表单

c - accept() 函数如何工作?

python - 尝试连接套接字时出现错误 10051

php - PHP 中最快的 IPC

java - Java Socket编程中如何实现一台服务器和多个客户端之间的通信?

Java - 反射获取方法的通用类型

java - 使用集合按顺序存储待处理的对象

java - java中的客户端服务器

java - 我将如何使用 jsoup 解析此 HTML 中的特定整数值?