不会通过客户端套接字上的ObjectInputStream循环读取字符串

时间:2014-06-17 03:23:45

标签: java sockets objectinputstream

我必须在服务器端通过套接字从服务器端向客户端发送字符串,我有以下代码

serverSocket=new ServerSocket(2004);
        socket=serverSocket.accept();
        System.out.println("request arrived");
        this.outStream=new ObjectOutputStream(socket.getOutputStream());
        outStream.flush();
        this.inStream=new ObjectInputStream(socket.getInputStream());

       //PoolTuningStrategy is an terface that is implemented by number of strategies

        for ( PoolTuningStrategy st : this.strategies ) {
                String name=st.getName();
            System.out.println("inside Loop "+name);

              outStream.writeObject(name);
              outStream.flush();
            }

          outStream.writeObject("END NAMES...");
          outStream.flush();

现在在服务器端,所有名称都正确地打印在控制台上。现在在客户端我有以下代码。

socket = new Socket("localhost", 2004);
System.out.println("Client starting");
this.outStream=new  ObjectOutputStream(socket.getOutputStream());
outStream.flush();
this.inStream=new   ObjectInputStream(socket.getInputStream());
do{
     name=(String)this.inStream.readObject();
     System.out.println(name);

  }while(name.equals("END NAMES..."));

但是只有第一个字符串在客户端打印,而不是全部! Plz帮帮我

2 个答案:

答案 0 :(得分:0)

你错过了!在while条件下的equals()测试前面。

没有歧义'这里。

答案 1 :(得分:0)

在服务器端,确保您正在呼叫outStream.close()。你也错过了!

我建议您更改代码:

while( ! "END NAMES...".equals( (name=this.inStream.readObject())) ){

或者喜欢这个

while("END NAMES...".compareTo( (name=this.inStream.readObject())) != 0 ){
      System.out.println(name);

  }

为什么呢? 1)通过使用" END NAMES ..." .equals(...),您可以避免NullPointerException,并且您的代码可以优雅地处理它。 2)您避免使用ClassCastException。 3)如果您已经在流的末尾,则避免IOException。 4)它更精简的代码。

此外,如果您在流上调用close(),则可能没有必要调用flush()。它可以通过添加函数调用来增加额外的负担。请注意,我们没有使用C / C ++。当缓冲区已满并且流自动结束时(编辑:关闭它时),Java将刷新。