套接字编程 TCP:“敲门服务器”

Socket Programing TCP: The "knock knock Server"

提问人:qiu 提问时间:8/5/2022 更新时间:8/5/2022 访问量:111

问:

概念:
我正在使用 TCP 套接字编写一个(简单的)服务器客户端应用程序。服务器旨在根据它最初收到的消息适当地回复客户端,以这种方式为客户端/用户创建接口。我一直在使用这个 oracle 教程示例作为我的指南。

错误
客户端无法接收来自服务器的响应,尽管我确信服务器发送响应时没有造成错误,因为 PrintWriter.checkError() 函数的输出为 false,这意味着没有触发任何错误。

我最好的猜测:
起初,我认为问题是服务器在客户端阻止使用 BufferedReader.readLine() 接收响应之前发送响应,但似乎并非如此,因为如果您认为套接字流使用 FIFO 精神“,这使得 TCP 协议异步,这意味着服务器将消息写入结构,然后客户端没有义务在写入后立即读取它。因此,我不认为时机是这里的问题。

那么我错过了什么?谢谢。

客户端 :

public static void main(String args[]){        
    try{
        Socket socket = new Socket(this.getServerIp(),this.getTcpServPort());
        socket.setReuseAddress(true);
        //to get input from user
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        //to send to server 
        PrintWriter out = new PrintWriter(socket.getOutputStream());
        //to receive from server)
        InputStreamReader in = new InputStreamReader(socket.getInputStream());
        BufferedReader brin = new BufferedReader(in);

             while(true){
             System.out.print("$");
             String str = new String();
             str = bf.readLine();
                if(str.equals("exit")){
                    break;
                }
             else if(str.equals("1")){
                     out.println(str);
                     out.flush();   
                     String resp;
                     //-> block and wait for response 
                     resp=brin.readLine();
                     if(resp==null){System.out.println("EOF");}
                     System.out.println(resp);
                 }   
                else{
                 System.out.println("Invalid command, type --help ");
             }  
            }//end of while 
       bf.close();
       in.close();
       brin.close();
       socket.close();
    }catch(IOException e){
        System.out.println(e.getMessage());
    }
}//end of main

服务器端 :

 public static void main(String args[]){ 
    try{
        ServerSocket serverSocket = new ServerSocket(servPort);
        
        Socket clSocket = serverSocket.accept();
        clSocket.setReuseAddress(true);

        InputStreamReader in = new InputStreamReader(clSocket.getInputStream()); 
        BufferedReader bf = new BufferedReader(in); 

        //newer
        PrintWriter out = new PrintWriter(clSocket.getOutputStream());

              while(true){ 
              String str=bf.readLine(); 
              System.out.println(str);             
              if(str.equals("exit")){ 
                break;
              }else if(str.equals("1")){ 
                  out.write("ack1"); 
                  out.flush();
                  System.out.println(out.checkError()); //false is normal
                  System.out.println("sent ack1");              
              }              
            }//end of while (hearing)
        out.close();
        clSocket.close(); 
        serverSocket.close();
        }catch(IOException e){
          System.out.println(e.getMessage());
        }//end of try-catch block      
}//end of main


Java 套接字异 TCP FIFO

评论

0赞 Steffen Ullrich 8/5/2022
客户端正在等待一行使用,并将阻塞,直到它到达行的末尾。不过,服务器不会发送行尾,只是.brin.readLine()"ack1"
0赞 qiu 8/5/2022
@SteffenUllrich谢谢。虽然这是一个正确且令人印象深刻的观察结果,但我改用了,不幸的是它不起作用。还有其他建议吗?out.write("ack1"); out.println("ack 1");

答: 暂无答案