2015-09-12 6 views
0

У меня есть этот код для подключения сервера к клиенту, мне нужно отправить объекты json на клиентский компьютер android studio, но метод escribir в строке printwriter имеет ошибку, и я не знаю, что проблема, смотрите код и помочь мнеОшибка Java с 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

+0

Спасибо я решить эту проблему –

ответ

0

socketnull, потому что вы его не устанавливаете.

Перед попыткой его использования необходимо убедиться, что сокет был создан.

+0

я могу изменить линию escritor = новый PrintWriter (socket.getOutputStream()); by escritor = new PrintWriter (servidor.accept(). getOutputStream(), true); ?? –

+1

Обратитесь к последнему редактированию в моем сообщении –

+0

@ AdriánSánchez вы можете, если вы принимаете сокет, и вам не нужно его читать. Вам лучше всего принять Socket только в одном месте, иначе вы, вероятно, вызовете путаницу, поскольку не знаете, какой accept() получит соединение сокета. –

0

1) После того, как серверный сокет принимает соединение, для клиента создается новый Socket.

2) Теперь передайте этот сокет методу leer() в качестве параметра. Не храните его в Servidor в качестве переменной-члена. Вы должны работать на многих сокетах на стороне сервера. Оставьте эту работу в Леер() метод

Ниже код должен быть изменен с

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

в

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

и у вас есть изменения подписи ухмылкой() метод, чтобы принять сокет в качестве параметра: public void leer(Socket socket)

EDIT:

3) Перед тем, как действовать, убедитесь, что Socket доступен в правильном состоянии. Вы можете достичь этого, передав Socket через методы или передав уникальный идентификатор, который может получить Socket.

например. Если вы замените Socket в основном классе с помощью ConcurretnHashMap уникального идентификатора строки (ключа) и Socket (значение) и получите сокет, передав идентификатор сокета по классам и методам.

Посмотрите рабочий пример Socket programming

+0

Хороший совет, но обратите внимание, что 'leer' не вызывает' escribir' –

+0

Проблема с переменной Socket в Servidor. Вы не можете иметь одиночную ссылку Socket для количества соединений N. Вы не знаете, какая ссылка на сокет удерживается в этой переменной. Когда клиентское соединение будет закрыто, этот сокет станет нулевым. –

+0

Согласен. Сокет не должен быть переменной, разделяемой потоками.Я подозреваю, что OP необходимо упростить их дизайн, чтобы иметь больше шансов на работу. –

Смежные вопросы