从客户端套接字向服务器套接字发送消息时出现问题
Problem when sending messages from client socket to server socket
我是套接字新手。我想制作一个客户端-服务器程序,但在服务器端打印消息时遇到问题。这让我相信我的客户端 class 在发送消息时出现了问题。从客户端发送到服务器的第一条消息传递正常,但即使打印了序列号,也不会打印其余消息。
这两个都是 classes:
客户class:
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());
}
}
}
服务器class:
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());
}
}
}
在客户端,您应该使用 PrintWriter 而不是 DataOutputStream 向服务器写入数据:
salidaServidor = new PrintWriter(cs.getOutputStream(), true);
在服务器端,'salidaCliente' 也应该是一个 PrintWriter。
[已更新,感谢@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"));
我是套接字新手。我想制作一个客户端-服务器程序,但在服务器端打印消息时遇到问题。这让我相信我的客户端 class 在发送消息时出现了问题。从客户端发送到服务器的第一条消息传递正常,但即使打印了序列号,也不会打印其余消息。
这两个都是 classes:
客户class:
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());
}
}
}
服务器class:
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());
}
}
}
在客户端,您应该使用 PrintWriter 而不是 DataOutputStream 向服务器写入数据:
salidaServidor = new PrintWriter(cs.getOutputStream(), true);
在服务器端,'salidaCliente' 也应该是一个 PrintWriter。
[已更新,感谢@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"));