通过套接字发送对象 [英] Send object via socket

查看:100
本文介绍了通过套接字发送对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想通过套接字发送x对象,但是当我运行此代码时却一无所获。
会停在 new ObjectInputStream(socket.getInputStream())
,并且不要做其他任何事情。

I want to send x object over socket but when I run this code i got nothings. it is stop at new ObjectInputStream(socket.getInputStream()) and don't do any thing else.

服务器类:

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();

}
}

处理程序类//处理类:

Handler class // Handle class:

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

You must declare the ObjectOutputStream before you declare the ObjectInputStream.

创建 ObjectInputStream 时,它将等待 ObjectOutputStream 中的数据。

When you create an ObjectInputStream, it waits for data from an ObjectOutputStream. It's waiting on that data (the 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 首先,它发送数据,但不会阻塞

If you declare ObjectOutputStream first, it sends the data, which isn't blocking

这篇关于通过套接字发送对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆