本文介绍了PrintWriter的Java错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这段代码将服务器与客户端连接,我需要将json对象发送到android studio客户端,但printwriter行中的escribir方法有错误,我不知道这是什么问题,请参阅的代码,并帮助我

I have this code to connect a server with a client, i need send json objects to a android studio client but the method escribir in the line of the printwriter have a error, and i dont konw what is the problem, please see the code and help me

public class Servidor {
ServerSocket servidor=null;
Socket socket=null;
BufferedReader lector=null;
PrintWriter escritor=null;
Gson gson = new Gson();
public Servidor(){

}
public static void main(String[] args) {
    Servidor Server=new Servidor();
    Server.iniciarHilo();
}
public void iniciarHilo(){

Thread principal=new Thread(new Runnable(){
    public void run(){
        try{
        servidor=new ServerSocket(8080);
        while(true){
            socket=servidor.accept();
            leer();
        }
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
});
principal.start();
System.out.println("Servidor iniciado......");
}
public void leer(){
    Thread leer_hilo=new Thread(new Runnable(){
    public void run(){
        RegUser registrar=new RegUser();
        try{
            lector=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while(true){
                JsonParser parser = new JsonParser();
                String mensaje= lector.readLine();
                JsonElement elemento = parser.parse(mensaje);
                String mensaje_in=elemento.getAsJsonObject().get("tipo").getAsString();
                if (lector==null){
                    System.out.println("Conexion Interrumpida....");
                }
                if (mensaje_in.equals("registrar")){
                    System.out.println("Solicitud de Registro");
                    registrar.newUser(elemento);
                }
                else if (mensaje_in.equals("ingresar")){
                    System.out.println("Solicitud de Ingreso");
                }


            }
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }

});
    leer_hilo.start();
}
public void escribir(final String dato){
    Thread escribir_hilo=new Thread(new Runnable(){
        public void run(){
            try{
                escritor= new PrintWriter(socket.getOutputStream());
                escritor.println(dato);
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
    });
escribir_hilo.start();
}

还有这个

public class RegUser {
Gson gson = new Gson();
ListaEnlazada listaUsuarios;
Comparar comparar=new Comparar();
public RegUser(){

}
public void newUser(JsonElement elemento) throws IOException{
    Servidor respuesta=new Servidor();
    //respuesta=new Servidor();
    String user=elemento.getAsJsonObject().get("nombre").getAsString();
    //boolean result=comparar.UserComp(user);
    if(true){
        listaUsuarios=new ListaEnlazada();
        listaUsuarios.add(elemento);
        System.out.println(listaUsuarios.get(0));
        JsonObject o = new JsonObject();
        o.addProperty("tipo", String.valueOf("registro"));
        o.addProperty("estado", String.valueOf("completo"));
        String enviar_mensaje = gson.toJson(o);
        respuesta.escribir(enviar_mensaje);

        }

错误是

  java.lang.NullPointerException

  at Servidor$3.run(Servidor.java:81)
  at java.lang.Thread.run(Thread.java:745)

通过套接字向客户端写入数据时出现错误,该错误在getOutputStream中

I has an error when writing a data through the socket to the client, the error is in the getOutputStream

推荐答案

1)服务器套接字接受连接后,将为客户端创建新的套接字.

1) Once server socket accept the connection, new Socket is created for the client.

2)现在将此套接字作为参数传递给leer()方法.不要将其作为成员变量存储在Servidor中.您必须在服务器端的许多套接字上进行操作.将该工作留给leer()方法

2) Now pass this socket to leer() method as parameter. Do not Store it in Servidor as member variable. You have to operate on many sockets on server side. Leave that job to leer() method

下面的代码应更改为

socket=servidor.accept();
 leer();

 socket=servidor.accept();
 leer(socket);

,并且您已经更改了leer()方法的签名以接受套接字作为参数:public void leer(Socket socket)

and you have change signature of leer() method to accept socket as parameter : public void leer(Socket socket)

3)在执行操作之前,请确保Socket在正确的状态下可用于相关方法.您可以通过在方法之间传递Socket或传递一些唯一的ID(可以检索Socket)来实现.

3) Make sure that Socket is available in right state to relevant method before you act on it. You can achieve it by passing Socket across methods Or pass some unique Id, which can retrieve the Socket.

例如如果您用唯一字符串ID(键)和Socket(值)的ConcurretnHashMap替换主类中的Socket,然后通过在类和方法之间传递套接字ID来检索套接字.

e.g. If you replace Socket in main class with ConcurretnHashMap of Unique String Id (key) and Socket(value) and retrieve the socket by passing socket id across classes and methods.

看看工作示例套接字编程

这篇关于PrintWriter的Java错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-14 17:18
查看更多