来自客户端的用户输入不会发送到服务器
User input from the client isn't going to the server
在我的客户端服务器应用程序中,客户端应该以给定的特殊格式(即 vp(size, transport, days)
)输入一些命令。现在如果客户端在错误的格式中输入错误的命令,它可以要求用户再次输入(这就是我在 else
中设置逻辑的方式)。但是之后,一旦客户端再次输入,程序就无法读取和发送命令。当用户再次输入请求时实际上没有任何反应。
如果需要,请让我post服务器端代码。
客户:
public class TCPClient {
static boolean run = true;
public static void main(String args[]) {
Socket client = null;
int portnum = 8080;
if (args.length >= 1) {
portnum = Integer.parseInt(args[0]);
}
new TCPClient(client, portnum);
}
public TCPClient(Socket client, int portNumber) {
try {
String answer = "";
String command = "";
// Creating client socket
client = new Socket(InetAddress.getLocalHost(), portNumber);
System.out.println("Client socket is made" + client);
// Creating output stream
OutputStream clientOut = client.getOutputStream();
PrintWriter pw = new PrintWriter(clientOut, true);
InputStream clientIn = client.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(clientIn));
BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
while (run) {
System.out.println("Mention the Family Size (FZ), Means of Travel (MT), Number of Days (ND) in the given format below: "
+ "vp(FZ,MT,ND)");//example: vp(2,air,30,)
command = userInput.readLine().trim(); //sending a request to the server
pw.println(command);
answer = br.readLine(); //reading the response from the server
System.out.println("Server replied: " + answer);
if (answer != null && answer.startsWith("Price")) {
System.out.println("Write your Name (N), ID number (ID) and Phone Number (PN) in the format: "
+ "PersonDetalis(N,ID,PN)");//
} else {
System.out.println("Program initializing.. Try again!");
new TCPClient(client, portNumber);
}
command = userInput.readLine().trim();//sending request
pw.println(command);
System.out.println("Server replied: " + br.readLine());
run = false;
}
pw.close();
br.close();
client.close();
} catch (IOException ie) {
System.out.println("I/O error. Run the program again ");
}
}
}
我认为问题出在您的服务器上,它只与第一个建立的连接通信。
在你的无限循环中
...
} else {
System.out.println("Program initializing.. Try again!");
new TCPClient(client, portNumber);
}
...
每次您创建一个新的连接(套接字),您必须在服务器上接受它。
我写了我自己的简单服务器
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket clientSocket = serverSocket.accept();
PrintWriter out =
new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
String line = in.readLine();
System.out.println("SERVER: received " + line);
out.println("server error");
out.close();
in.close();
clientSocket.close();
}
它奏效了。
我建议您将复杂的逻辑从 TCPClient 构造函数中移走,并在 System.out.println("Program initializing.. Try again!");
之后停止每次创建新的 TCPClient 并改用相同的连接。
但是,如果您这样做,它将不适用于我的服务器代码示例,因为我的服务器在收到某些内容并发回回复后立即关闭连接。
在我的客户端服务器应用程序中,客户端应该以给定的特殊格式(即 vp(size, transport, days)
)输入一些命令。现在如果客户端在错误的格式中输入错误的命令,它可以要求用户再次输入(这就是我在 else
中设置逻辑的方式)。但是之后,一旦客户端再次输入,程序就无法读取和发送命令。当用户再次输入请求时实际上没有任何反应。
如果需要,请让我post服务器端代码。
客户:
public class TCPClient {
static boolean run = true;
public static void main(String args[]) {
Socket client = null;
int portnum = 8080;
if (args.length >= 1) {
portnum = Integer.parseInt(args[0]);
}
new TCPClient(client, portnum);
}
public TCPClient(Socket client, int portNumber) {
try {
String answer = "";
String command = "";
// Creating client socket
client = new Socket(InetAddress.getLocalHost(), portNumber);
System.out.println("Client socket is made" + client);
// Creating output stream
OutputStream clientOut = client.getOutputStream();
PrintWriter pw = new PrintWriter(clientOut, true);
InputStream clientIn = client.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(clientIn));
BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
while (run) {
System.out.println("Mention the Family Size (FZ), Means of Travel (MT), Number of Days (ND) in the given format below: "
+ "vp(FZ,MT,ND)");//example: vp(2,air,30,)
command = userInput.readLine().trim(); //sending a request to the server
pw.println(command);
answer = br.readLine(); //reading the response from the server
System.out.println("Server replied: " + answer);
if (answer != null && answer.startsWith("Price")) {
System.out.println("Write your Name (N), ID number (ID) and Phone Number (PN) in the format: "
+ "PersonDetalis(N,ID,PN)");//
} else {
System.out.println("Program initializing.. Try again!");
new TCPClient(client, portNumber);
}
command = userInput.readLine().trim();//sending request
pw.println(command);
System.out.println("Server replied: " + br.readLine());
run = false;
}
pw.close();
br.close();
client.close();
} catch (IOException ie) {
System.out.println("I/O error. Run the program again ");
}
}
}
我认为问题出在您的服务器上,它只与第一个建立的连接通信。 在你的无限循环中
...
} else {
System.out.println("Program initializing.. Try again!");
new TCPClient(client, portNumber);
}
...
每次您创建一个新的连接(套接字),您必须在服务器上接受它。 我写了我自己的简单服务器
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket clientSocket = serverSocket.accept();
PrintWriter out =
new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
String line = in.readLine();
System.out.println("SERVER: received " + line);
out.println("server error");
out.close();
in.close();
clientSocket.close();
}
它奏效了。
我建议您将复杂的逻辑从 TCPClient 构造函数中移走,并在 System.out.println("Program initializing.. Try again!");
之后停止每次创建新的 TCPClient 并改用相同的连接。
但是,如果您这样做,它将不适用于我的服务器代码示例,因为我的服务器在收到某些内容并发回回复后立即关闭连接。