2015-09-14 117 views
0

我有这个代码在eclipse中与服务器在android studio中的客户端进行通信,我使用套接字,客户端发送消息到服务器,服务器读取消息并确定一切正常,但是当服务器向客户端发送消息时,客户端不会收回任何东西;这是代码服务器 - 与套接字的客户端通信Java

public class Servidor { 
ServerSocket servidor=null; 
String funcion; 
public static Socket socket; 
BufferedReader lector=null; 
RegUser registrar=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(); 
      escribir(); 
     } 

     }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(){ 
     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")){ 
        RegUser registrar=new RegUser(); 
        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(){ 
    Thread escribir_hilo=new Thread(new Runnable(){ 
     public void run(){ 
       try{ 
        escritor= new PrintWriter(socket.getOutputStream(),true); 
        escritor.println(funcion); 
        System.out.println(funcion); 
       }catch(Exception ex){ 
        ex.printStackTrace(); 
       } 


     } 
    }); 
    escribir_hilo.start(); 
} 

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

} 
public void newUser(JsonElement elemento){ 
    Servidor respuesta=new Servidor(); 
    //respuesta=new Servidor(); 
    String user=elemento.getAsJsonObject().get("nombre").getAsString(); 
    if(comparar.UserComp(user)){ 
     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); 
     funcion=enviar_mensaje.toString(); 
     escribir(); 

     } 
    else 
    { 
     JsonObject comp = new JsonObject(); 
     comp.addProperty("tipo","registro"); 
     comp.addProperty("estado","existe"); 
     String comparar=gson.toJson(comp); 
     funcion=comparar.toString(); 
     escribir(); 
    } 

} 

此代码是服务器代码,如果你需要在客户端代码(Android Studio中),请告诉我。

我需要帮助,请

回答

1

你不能有

public static Socket socket在多客户端服务器架构服务器。服务器在“接受”方法中创建客户端套接字。

想想多个客户端连接到单个服务器的场景。如果您在服务器上有静态套接字,则它只能服务器套接字。那么如何处理连接到服务器的“N”个客户端呢?

  1. 在Servidor

  2. 删除静态套接字上创建套接字accept()方法之后,插座传递给leer()escribir()方法,这需要插座。

+0

我可以使用公共Socket套接字; ?? –

+0

这也不服务于目的。每个客户端应该有一个套接字。如果100个客户端连接到服务器,则服务器应该有100个套接字来处理每个客户端。 –

+0

请参阅我的答案和评论http://stackoverflow.com/questions/32542152/java-error-with-a-printwriter –

0

如果您能够在C#服务中托管你的服务器我已经创建了一个支持的连接1000的一个开源项目,包括保活协议(AKA心跳协议),认证模型,它可以很容易地扩展以及Java,Objective-C和C#API。该文档包括适用于Android,iOS和Windows Mobile的示例。你可以找到它here