[英]Problem when sending messages from client socket to server socket
I'm new to socket.我是套接字的新手。 I want to make a client-server program but I have a problem when it comes to printing messages on the side of the server.
我想制作一个客户端-服务器程序,但是在服务器端打印消息时遇到了问题。 That leads me to believe there is a problem in my Client class when it is sending the messages.
这让我相信我的客户端 class 在发送消息时存在问题。 The first message that is sent from client to server is delivered fine but the rest aren't printed even though the sequence number is printed.
从客户端发送到服务器的第一条消息可以正常传递,但是即使打印了序列号,也不会打印 rest。
Here are both classes:这是两个类:
Client class:客户端 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());
}
}
}
Server class:服务器 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());
}
}
}
[Updated, thanks to @user207421's comment] [更新,感谢@user207421 的评论]
2 solutions 2个解决方案
Keep using DataOutputStream.writeUTF
继续使用
DataOutputStream.writeUTF
Then you have to use DataInputStream.readUTF
instead of BufferedReader.readLine
.然后你必须使用
DataInputStream.readUTF
而不是BufferedReader.readLine
。
And if you want to use '\n' as a separator, you will have to detect such characters如果您想使用 '\n' 作为分隔符,则必须检测此类字符
Keep using BufferedReader.readLine
继续使用
BufferedReader.readLine
Then you have to use an output stream method like Writer.write
instead of DataOutputStream.writeUTF
.然后你必须使用 output stream 方法,比如
Writer.write
而不是DataOutputStream.writeUTF
。
Use only one BufferedReader
instance, on server side at least ( numString
will keep buffered data that will not be available for the entrada
instance).至少在服务器端仅使用一个
BufferedReader
实例( numString
将保留对entrada
实例不可用的缓冲数据)。
For UTF-8, use:对于 UTF-8,使用:
BufferedReader in = new BufferedReader(new InputStreamReader(cs.getInputStream(), "UTF-8"));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(cs.getOutputStream(), "UTF-8"));
On the client side, you should use a PrintWriter instead of a DataOutputStream to write data to the server:在客户端,您应该使用 PrintWriter 而不是 DataOutputStream 将数据写入服务器:
salidaServidor = new PrintWriter(cs.getOutputStream(), true);
On the server side, 'salidaCliente' should also be a PrintWriter.在服务器端,'salidaCliente' 也应该是 PrintWriter。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.