简体   繁体   English

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

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

  1. 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' 作为分隔符,则必须检测此类字符

  2. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM