为什么for循环在第二次迭代时停止读取来自客户端的UTF ?



我正在尝试以下操作:我正在进行服务器-客户端消息交换。在第一个for循环中,我向客户端询问他想要执行的任务数量,并询问任务的描述和状态,然后从我创建的类中创建一个对象,并将其放入ArrayList中。当涉及到第二次迭代时,控制台就会挂起,并且不会要求第三次或任何距离第二次迭代更远的迭代。那么我猜同样的问题也发生在状态…这是我为练习写的代码,对不起,如果是一个愚蠢的问题,我是新手,我正在努力学习。非常感谢

Server.java

package server;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;
public class Server {
private final int Port = 9876;
private ServerSocket serverSocket;
private Socket socket;
ArrayList<Tarea> tarea = new ArrayList<Tarea>();
Scanner sc = new Scanner(System.in);
public Server() throws IOException {
serverSocket = new ServerSocket(Port);
socket = new Socket();
}
public void iniciarServidor() throws IOException {

while (true) {
System.out.println("Esperando al cliente");
socket = serverSocket.accept();
System.out.println("El cliente se ha conectado");
DataOutputStream input = new DataOutputStream(socket.getOutputStream());
DataInputStream output = new DataInputStream(socket.getInputStream());
input.writeUTF("Introduzca el nombre del cliente: ");
String nombre = output.readUTF();
System.out.println("Nombre cliente: " + nombre);
String descripcion = "";
boolean estado;

Tarea t = new Tarea();
input.writeUTF("Muy buenas " + nombre
+ " especifique numero de tareas:");
int numeroTareas = output.readInt();

for(int i = 0;i<numeroTareas;i++){                                                        

input.writeUTF("Especifique descripcion para la tarea "+i+" :");
descripcion = output.readUTF();
input.writeUTF("Especifique el estado 'true o false' para la tarea "+i+" :");
estado = output.readBoolean();

t = new Tarea(descripcion,estado);  
tarea.add(t);

}

sc.nextLine();


input.writeUTF("El servidor va a enviar todas las tareas");

for(int i = 0;i<tarea.size();i++){
input.writeUTF("Numero tarea: "+i);
input.writeUTF("Descripcion: "+tarea.get(i).getDescripcion());
input.writeUTF("Estado: "+tarea.get(i).isEstado());
}


socket.close();
System.out.println("Cliente desconectado");
output.close();
input.close();
}
}

}

Client.java

package client;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;
import server.Tarea;

public class Client {
private final String Host = "localhost";
private final int Port = 9876;
private final Socket socket;
ArrayList<Tarea> tarea = new ArrayList<Tarea>();

public Client() throws IOException {
socket = new Socket(Host, Port);
}
public void iniciarCliente() throws IOException {

String descripcion;
boolean estado;

DataInputStream input = new DataInputStream(socket.getInputStream());
DataOutputStream output = new DataOutputStream(socket.getOutputStream());
Scanner sc = new Scanner(System.in);
//Servidor solicita nombre usuario
System.out.println(input.readUTF());
output.writeUTF(sc.nextLine());
//Numero de tareas a realizar
System.out.println(input.readUTF());
output.writeInt(sc.nextInt());
sc.nextLine();
//Servidor solicita descripcion tarea
System.out.println(input.readUTF());
descripcion = sc.next();
output.writeUTF(descripcion);
//Servidor solicita estado de tarea
System.out.println(input.readUTF());
estado = sc.nextBoolean();
output.writeBoolean(estado);
//Servidor confirma que va a enviar las tareas
System.out.println(input.readUTF());
//Servidor envia todas las tareas;
System.out.println(input.readUTF());
System.out.println(input.readUTF());
System.out.println(input.readUTF());


socket.close();
input.close();
output.close();
System.out.println("Fin, Desconectado del servidor");
sc.close();
}

}

Tarea.java

package server;
import java.util.ArrayList;
/**
*
* @author Lluis
*/
public class Tarea {

private String descripcion;
private boolean estado;


public Tarea(){

}

public Tarea(String descripcion, boolean estado){
this.descripcion = descripcion;
this.estado = estado;
}

public String mandarDesc(ArrayList<Tarea> tarea) {

for(int i=0; i<tarea.size(); i++) {
setDescripcion(tarea.get(i).getDescripcion());
}

return getDescripcion();
}

public boolean mandarEstado(ArrayList<Tarea> tarea) {

for(int i=0; i<tarea.size(); i++) {
setEstado(tarea.get(i).isEstado());
}

return isEstado();
}

public String toString() {
return getDescripcion()+ " Estado: /n " + isEstado();
}
/**
* @return the descripcion
*/
public String getDescripcion() {
return descripcion;
}
/**
* @param descripcion the descripcion to set
*/
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
/**
* @return the estado
*/
public boolean isEstado() {
return estado;
}
/**
* @param estado the estado to set
*/
public void setEstado(boolean estado) {
this.estado = estado;
}

}

什么引起了我的注意:

Server.java

Scanner sc = new Scanner(System.in);
...
sc.nextLine();

是否可能您的服务器正在等待stdin上的按键而不是网络套接字上的按键?

最新更新