要把 in.readLine(); 写在循环里面
否则一旦 读不到东西 就跳出了循环 程序就结束了
而不是什么 阻塞while(true){
  line = in.readLine();
  str = str + line + "\n";
  System.out.println(line);  System.out.println(""+str);
  out.write(str);
  out.flush();
}之后你就要重新选择条件跳出循环 比如接收到 特殊字符 如 Bye 等

解决方案 »

  1.   

    server side and client side, the in and out should be swapped order.
    server:
    in = ....
    out = ....
    client:
    out = ....
    in = ....
    没有理由的,java的bug吧,不然,有的时候工作,有的时候就会死掉。
      

  2.   

    开个线程,并且把读的操作如 telenths(_非法操作_) 所说
      

  3.   

    但是我的这种操作类试与登录操作。
    首先,发送自己的消息,
    服务器验证后,发回确认的消息。
    然后才启动线程。
    to  telenths(_非法操作_) :
      你那样做好像不行哦。他也是停在in.readline()上,
    而且也不是我需要的那种效果。
      

  4.   

    首先,建议先把顺序改一下
    server 
    out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    client 
    out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));这可不是法x功,我又一次也是调试了很久,最后把顺序改了一下就可以了其次,我想你建立连接应该还是有后续通讯的吧~~就是说,在启动你所谓的线程后应该还是保持连接的,如果是这样的话,应该把read写在线程里
    while(aliveFlag){
    read();
    }
    而写(write)就只是要写的时候在调用的~~~~你试试看
    如果只是告诉服务器要做什么,而不用等待其结果的话,怎么不用rmi??
      

  5.   

    再就是java在这里好像想没有bug不要轻易怀疑的哦~~~再就是在1.4以前的官方java都是阻塞i/o方式的。你可以下在新的版本,或是用一些免费的
    非阻塞i/o包。不过好想和你这个没有什么关系~~`
      

  6.   

    那是因为在 client 里 你只向 server 写了一句话
     out.write("kaksdf\nkklasdf\n");
    这句话之后 server 就接受不到任何 请求了
    line = in.readLine() 始终为 null
    你还想让他怎么走呢?
      

  7.   

    to: schfrog2003(schfrog)
    换了也没有效果。
    这就像一个login过程,server读取后
    to:telenths(_非法操作_) 
    如果
    ling = null那就应该跳出循环啊!!本来认为in.readLine()是因为没有读满一行,它就阻塞,直至socket为其填满一行
    后将其唤醒,但是如果Client去掉接收那断,Server去掉回复那断,
    server就可以收到client发送的数据
      

  8.   

    to: schfrog2003(schfrog)
    换了也没有效果。
    这就像一个login过程,server读取后判断是否接收这个Socket,如果不是它需要的将不和其继续通信,直接关闭客户Socket,否则才启动线程,接收通信信息。
      

  9.   

    在CLIENT端应该改为:
    out.write("kaksdf\nkklasdf\n");
    out.flush();
    out.close();
    你不关闭的话是不会把数据传出去的!
      

  10.   

    是这样的:
    in.readLine() 只有在读到数据后才会继续往下走
    读不到数据 他就会等待所以造成了 阻塞的现象
      

  11.   

    to telenths(_非法操作_):那应该如何解决这样的问题??
    有什么好的方法??
    谁能给出方法,将单独再得100分!!
      

  12.   

    在建立SOCKET的时候设置超时时间啊
    时间一到会报出一个TIMEOUT异常
      

  13.   

    Socket socket = new Socket(_sIP,_iPort);
                        socket.setSoTimeout(1000);                        try {
                                sCurrentLine = in.readLine();
                            }
                            catch (Exception ex) {
                                System.out.println(ex.getMessage());
                            }
      

  14.   

    在这种读取上面,我一直不用readLine是不是为null来判断,而是在字符串里面加特殊字符或者在字符串前加长度来判断一个字符串是不是接收完毕,我有过经验教训的。