【问题标题】:ObjectOutputStream - client/server communicationObjectOutputStream - 客户端/服务器通信
【发布时间】:2014-10-07 08:02:18
【问题描述】:

我是 Java 客户端服务器通信的新手,我遇到了从客户端向服务器端发送对象的问题。不知何故,我的程序在尝试传输对象时卡住了。可能的原因可能是 ObjectOutputStream 实现。

数据库登录按钮

class Handler implements ActionListener {
   Client client = new Client();
   List<String> parameterList = new ArrayList<String>();
   ClientParameter parameter;

   public void actionPerformed(ActionEvent event) {
      if(event.getSource()==buttonConnect) {
         parameterList.add(username);
         parameterList.add(password);
         parameter = new ClientParameter(parameterList);
         client.connectToServer(parameter);
}

对象客户端参数

public class ClientParameter {
   List<String> parameterList;

   public ClientParameter(List<String> parameterList) {
      this.parameterList = parameterList;
   }

   public List<String> getParameterList() {
      return parameterList;
   }
   public void setParameterList(List<String> parameterList) {
      this.parameterList = parameterList;
   }
}

类客户端

public void connectToServer(ClientParameter parameter) {
   // Verbindung mit dem Server herstellen
   Socket server = null;
   try {
      server = new Socket("localhost", 3141);
      // programm hangs while reading this 2 lines..
      ObjectInputStream objectIn = new ObjectInputStream(server.getInputStream());
      ObjectOutputStream objectOut = new ObjectOutputStream(server.getOutputStream());

      objectOut.writeObject(parameter);
   } catch(UnknownHostException e) {
      e.printStackTrace();
   } catch(IOException e) {
      e.printStackTrace();
   } finally {
      if(server!=null) {
         try {
            server.close();
         } catch(IOException e) {
            System.out.println(e);
         }
      }
   }
}

还有服务器类

public class Server {
   private static void handleConnection(Socket client) throws IOException {
      ObjectInputStream objectIn = new ObjectInputStream(client.getInputStream());
      ObjectOutputStream objectOut = new ObjectOutputStream(client.getOutputStream());

      ClientParameter parameter;
      try {
         parameter = (ClientParameter) objectIn.readObject();
         System.out.println(parameter);
      } catch (ClassNotFoundException e) {
         e.printStackTrace();
      }
   }

   public static void main(String[] args) throws IOException {
      ServerSocket server = new ServerSocket(3141);
      while(true) {
         Socket client = null;
         try {
            client = server.accept();
            handleConnection(client);
         }
         catch(IOException e) {
            e.printStackTrace();
         }
         finally {
            if(client!=null) {
               try {
                  client.close();
               }
               catch(IOException e) {
                  System.out.println(e);
               }
            }
         }
      }
   }
}

谢谢!

【问题讨论】:

  • ClientParameter 必须是可序列化的
  • 感谢您提供的信息,但是读取ObjectInputStream和ObjectOutputStream这两行时仍然出现错误
  • 尝试刷新流。

标签: java object client-server objectinputstream objectoutputstream


【解决方案1】:

服务器首先读取客户端发送的内容。客户端也从读取服务器发送的内容开始。所以这是一个僵局。

确实,as documented,ObjectInputStream 的构造函数会阻塞,直到它收到序列化流标头:

从流中读取序列化流标头并进行验证。此构造函数将阻塞,直到相应的 ObjectOutputStream 写入并刷新了标头。

删除以下行,因为无论如何您都不会对 ObjectInputStream 做任何事情:

ObjectInputStream objectIn = new ObjectInputStream(server.getInputStream());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-26
    • 2011-09-05
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2011-07-06
    相关资源
    最近更新 更多