提问人:qiu 提问时间:8/5/2022 更新时间:8/5/2022 访问量:111
套接字编程 TCP:“敲门服务器”
Socket Programing TCP: The "knock knock Server"
问:
概念:
我正在使用 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
答: 暂无答案
评论
brin.readLine()
"ack1"
out.write("ack1");
out.println("ack 1");