从客户端套接字向服务器套接字发送消息时出现问题

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 个解决方案

  1. 继续使用DataOutputStream.writeUTF
    那么你必须使用 DataInputStream.readUTF 而不是 BufferedReader.readLine.
    而如果你想使用'\n'作为分隔符,你将不得不检测这样的字符

  2. 继续使用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"));