问题描述:发生互相等待。烦请大虾们指教,感激不尽!服务器端程序如下:
package net;import java.net.*;
import java.io.*;public class TCPServer {
    public static void main(String[] args) throws IOException {
        ServerSocket ss=new ServerSocket(8899);
        while(true) {
          Socket s=ss.accept();
          DataOutputStream dos = new DataOutputStream(s.getOutputStream());
          BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
          String clientStr="hello sir!";
          
          while(clientStr!=null) {
             dos.writeUTF(new BufferedReader(new InputStreamReader(System.in)).readLine());
             dos.flush();
             clientStr=br.readLine();
             System.out.println("client: "+clientStr);
             
              if("bye".equals(clientStr)) {
                  break;
              }
          }
          br.close();
          dos.close();
          s.close();
        }
    }
}客户端程序如下:
package net;import java.net.*;
import java.io.*;public class TCPClient {
    public static void main(String[] args) throws IOException{
        Socket s=new Socket("localhost",8899);
        DataOutputStream  dos=new DataOutputStream(s.getOutputStream()); 
        BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));        
        String serverStr=null;
        
        while((serverStr=br.readLine())!=null) {
           System.out.println("server: "+serverStr);
           dos.writeUTF(new BufferedReader(new InputStreamReader(System.in)).readLine());
            dos.flush();
            
           if("bye".equals(serverStr)) {
               break;
           }
        }
        dos.close();
        br.close();
    }
}
编译通过运行 >java net.TCPServer
运行 >java net.TCPClient
在服务器端输入:hello
结果客户端和服务器端互相等待。仔细检查了两个程序,小弟眼拙,没有发现出现死锁的地方,请哪位帮忙看一下,谢谢了

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【apple_pie】截止到2008-07-07 22:29:32的历史汇总数据(不包括此帖):
    发帖的总数量:1                        发帖的总分数:20                       
    结贴的总数量:1                        结贴的总分数:20                       
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    敬礼!
      

  2.   

    我是李老师,在这里给你回复。很奇怪,使用DataOutputStream好像不能正常使用,是不是也要刷新?
    服务器端程序:
      import java.io.*; public class TCPServer { 
        public static void main(String[] args) throws IOException { 
        
           //将套接字的创建等工作放在循环的外面。
            ServerSocket ss=new ServerSocket(8899); 
            Socket s=ss.accept(); 
            
            //这个流改成PrintWriter
            PrintWriter dos = new PrintWriter(s.getOutputStream()); 
            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
            String clientStr="hello sir!"; 
             
            while(true) { 
                dos.println(new BufferedReader(new InputStreamReader(System.in)).readLine()); 
                dos.flush(); 
                clientStr=br.readLine(); 
                System.out.println("client: "+clientStr); 
                
                  if("bye".equals(clientStr)) { 
                      break; 
                  } 
             
             
            }
             //流的关闭也放在循环的外面。
             br.close(); 
             dos.close(); 
             s.close();  
        } 

    客户端程序:
      
    package net; import java.net.*; 
    import java.io.*; public class TCPClient { 
        public static void main(String[] args) throws IOException{ 
            Socket s=new Socket(InetAddress.getLocalHost(),8899); 
             //这个流改成PrintWriter
            PrintWriter  dos=new PrintWriter(s.getOutputStream()); 
            BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));        
            String serverStr="Start"; 
           
            
            //while((serverStr=br.readLine())!=null) { 
           
            while(true){
              serverStr=br.readLine();
              System.out.println("server: "+serverStr);           
              dos.println(new BufferedReader(new InputStreamReader(System.in)).readLine()); 
              dos.flush(); 
              if("bye".equals(serverStr)) { 
                  break; 
              } 
            } 
            dos.close(); 
            br.close(); 
         
        } 

      

  3.   


    把DataOutputStream 该成PrintWriter 就可以了。
    我想问题可能出在输入和输出流一个是基于字符另一个是基于字节,不匹配的原因吧。
    有没有高手能解释一下?
      

  4.   

    找到原因了:
    server使用dos.writeUTF(new BufferedReader(new InputStreamReader(System.in)).readLine())写出的流中不包含行结束符号'\r',所以client使用serverStr=br.readLine()从输入流中读时会一致等待;同样client发送消息时也是这个原因导致server在等待。
    可以使用dos.writeUTF(new BufferedReader(new InputStreamReader(System.in)).readLine()+ "\r")在写出去的流中添加一个换行符,client和server就可以工作了,不过我测试了编码有点乱,输入bye并不结束。
      

  5.   

    应该是没有输出换行符的原因,
    不是没有flush的原因.缓冲区已经被刷新了.也就是说,数据已经发送给对方的.
    但是,接收方,调用的readLine方法.该方法是阻塞读的.如果没有读到换行符,那就一直阻塞.
    出现相互等待的状况.
    楼主有兴趣,可以试着,在dos.flush();方法前边,加一个dos.write("\n");应该可以解决该问题.注意,你的那个readLine方法.读入的数据,其实是没有换行符的.呵呵.
      

  6.   

    首先多谢各位的热心帮助。我说写出去的字符怎么收不到,原来是readLine()要读取换行符啊!但是请问DataOutputStream的writeUTF()如何得知不接收换行符呢?小弟查过api,说的不清楚,哪位能赐教,
      

  7.   

    客户端
    import java.io.*;
    import java.net.*;
    public class Client{
    public static void main(String args[]){
    Client c1=new Client();
    try{
    c1.client();
    }catch(Exception e){
    System.out.println("异常");
    }
    }
    public void client() {
    Socket s=null;
    DataInputStream is=null;
    DataOutputStream os=null;
    try{
    s=new Socket("10.5.7.82",2008);
    is=new DataInputStream(s.getInputStream());
    os=new DataOutputStream(s.getOutputStream());
    //Client c=new Client();
    os.writeUTF("this is client");
    //System.out.println(a);
    String a=is.readUTF();
    System.out.println(a);
    }catch(IOException e){
    System.out.println("有异常");
    }finally{
    try{
    s.close();
    is.close();
    os.close();
    }catch(IOException e){
    System.out.println("流没有关闭");
    }
    }

    }
    }
      

  8.   

    服务器端
    import java.net.*;
    import java.io.*;
    public class Server{
    public static void main(String args[]){
    Sever s1=new Sever();
    try{
    s1.sever();
    }catch(Exception e){
    System.out.println("服务器异常");
    }
     }
    public void sever() {
    ServerSocket ss=null;
    Socket ss1=null;
    DataInputStream is=null;
    DataOutputStream os=null;
    try{
    ss=new ServerSocket(2008);
    ss1=(ss.accept());
    is=new DataInputStream(ss1.getInputStream());
    os=new DataOutputStream(ss1.getOutputStream());
    // Sever se=new Sever();
    String a=is.readUTF();
    System.out.println(a);
    os.writeUTF("this server ok");
    // System.out.println(b);
    }catch(IOException e){
    System.out.println("异常");
    }finally{
    try{
    ss.close();
    ss1.close();
    is.close();
    os.close();
    }catch(IOException e){
    System.out.println("关闭异常");
    }
    }
    }
    }