当前位置: 首页 > 知识库问答 >
问题:

PrintWriter出现Java错误[重复]

彭鸿文
2023-03-14

我有这段代码来连接服务器和客户端,我需要将json对象发送到android studio客户端,但是printwriter行中描述的方法有错误,我不知道问题出在哪里,请查看代码并帮助我

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中

共有2个答案

马琛
2023-03-14

1) 一旦服务器套接字接受连接,就会为客户端创建新的套接字。

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

下面的代码应该从

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

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

您需要更改leer()方法的签名以接受socket作为参数:public void leer(socket socket)

编辑:

3)在对其采取行动之前,确保Socket处于相关方法的正确状态。您可以通过跨方法传递Socket或传递一些唯一的Id来实现它,这可以检索Socket。

e、 g.如果用唯一字符串Id(键)和套接字(值)的ConcurrentNHashmap替换主类中的套接字,并通过跨类和方法传递套接字Id来检索套接字。

看看Socket编程的工作示例

司寇祖鹤
2023-03-14

套接字null,因为您没有设置它。

在尝试使用套接字之前,您需要确保已创建套接字。

 类似资料:
  • 问题内容: 我是Java的初学者,我正在尝试创建一个在光标所在的位置绘制一个矩形的应用程序。我已经完成了所有操作,但无法获得重绘的信息。如果没有重绘,则矩形仅绘制一次,仅此而已。使用重新绘制,它可以很好地编译,但是当我运行它时,每次移动鼠标时,都会出现这个大错误。 所以,有人可以帮我吗? 问题答案: 希望代码示例中的注释能够告诉您您在代码中做错了什么:-),否则总有理由提出您的疑问…

  • 问题内容: 根据运行时错误消息,异常发生在下一行; 是具有构造函数和重载构造函数的类,其中包含有关数据库中每种病毒的特定信息,例如; 字符串vName 字符串vDefinition 重载 具有标记化定义的数组(以xLength组分隔) 具有LCS令牌的阵列 有等级浮动 类型的是.iterator(),如下所示: 是和ArrayList类型,用于存储病毒对象 (此时为名称和定义), 以便以后使用。

  • 主要内容:1 什么是Java PrintWriter,2 Java PrintWriter的语法,3 Java PrintWriter的方法,4 Java PrintWriter的例子1 什么是Java PrintWriter Java PrintWriter类是Writer类的实现。它用于将格式化的对象表示形式打印到文本输出流。 2 Java PrintWriter的语法 3 Java PrintWriter的方法 方法 描述 PrintWriter append(char c) 输出指定的布

  • 本文向大家介绍Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException,包括了Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException的使用技巧和注意事项,需要的朋友参考一

  • 我试图使用javamail示例包中的ShowMsg.java读取gmail消息,但在运行时不断出现此错误。虽然程序编译得很好。 以下是错误消息: 我运行的命令是,编译它的命令是。javax.mail.jar包含在lib文件夹中 这是一些更短的替代代码,并得到相同的错误:

  • 问题内容: 当前在WTForms中访问错误,您必须像这样遍历字段错误: 由于我正在构建一个不使用任何表单视图的rest应用程序,因此我不得不检查所有表单字段以查找错误所在。 有没有办法可以做类似的事情: 问题答案: 实际对象的属性包含字典中的字段名称及其错误。因此,您可以执行以下操作: