我是套接字的新手。我想制作一个客户端-服务器程序,但是在服务器端打印消息时遇到了问题。这让我相信我的 Client 类在发送消息时存在问题。从客户端发送到服务器的第一条消息可以正常传递,但即使打印了序列号,也不会打印其余的消息。
这是两个类:
客户端类:
public class Cliente extends Conexion {
private String mensaje;
private String recibeTeclado;
int numSec = 0;
String tipo = "0";
private int num;
int c;
public Cliente() throws IOException{
super("cliente");
}
public void startClient() {
try {
salidaServidor = new DataOutputStream(cs.getOutputStream());
Scanner lee = new Scanner(System.in);
System.out.println("How many messages do you want to send?");
num = lee.nextInt();
salidaServidor.writeUTF(":" + num + "\n");
for (int i = 1; i <= num; i++) {
numSec++;
System.out.println("Enter the message: ");
recibeTeclado = lee.next();
mensaje = tipo + ":" + Integer.toString(numSec) + ":" + recibeTeclado + "\n";
salidaServidor.writeUTF(mensaje);
salidaServidor.flush();
BufferedReader in = new BufferedReader (new InputStreamReader (cs.getInputStream()));
String mensajeDelServidor = in.readLine();
System.out.println("Status : " + mensajeDelServidor);
}
cs.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
服务器类:
public class Servidor extends Conexion{
String nuevo;
int numSec=0;
String tipo="1";
int num;
String [] n;
public Servidor() throws IOException{super("servidor");}
public void startServer() {
try {
System.out.println("Waiting...");
cs = ss.accept();
BufferedReader numString = new BufferedReader(new InputStreamReader(cs.getInputStream()));
n=numString.readLine().split(":");
num=Integer.parseInt(n[1]);
for(int i=1; i<=num; i++) {
salidaCliente=new DataOutputStream(cs.getOutputStream());
numSec++;
System.out.println(numSec);
nuevo= tipo +":"+ Integer.toString(numSec) +":"+ "Received\n";
salidaCliente.writeUTF(nuevo);
salidaCliente.flush();
BufferedReader entrada = new BufferedReader(new InputStreamReader(cs.getInputStream()));
boolean band=false;
while((mensajeServidor=entrada.readLine())!=null && !band) {
String[] arrSplit = mensajeServidor.split(":");
System.out.println(arrSplit[2]);
band=true;
}
}
System.out.println("Fin de la conexión");
ss.close();
cs.close();
}catch (Exception e)
{
System.out.println(e.getMessage());
}
}
}
答案 0 :(得分:0)
[更新,感谢@user207421 的评论]
2 个解决方案
继续使用DataOutputStream.writeUTF
那么你必须使用 DataInputStream.readUTF
而不是 BufferedReader.readLine
。
如果你想使用 '\n' 作为分隔符,你将不得不检测这样的字符
继续使用BufferedReader.readLine
然后你必须使用像 Writer.write
这样的输出流方法而不是 DataOutputStream.writeUTF
。
仅使用一个 BufferedReader
实例,至少在服务器端(numString
将保留对 entrada
实例不可用的缓冲数据)。
对于 UTF-8,请使用:
BufferedReader in = new BufferedReader(new InputStreamReader(cs.getInputStream(), "UTF-8"));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(cs.getOutputStream(), "UTF-8"));
答案 1 :(得分:-1)
在客户端,您应该使用 PrintWriter 而不是 DataOutputStream 将数据写入服务器:
salidaServidor = new PrintWriter(cs.getOutputStream(), true);
在服务器端,'salidaCliente' 也应该是一个 PrintWriter。