簡體   English   中英

服務器-與套接字Java的客戶端通信

[英]Server - Client Communication with Sockets Java

我有這段代碼在Eclipse中與android studio中的客戶端通信服務器,我正在使用套接字,客戶端將消息發送到服務器,服務器讀取了該消息,然后一切正常,但是當服務器向客戶端發送消息時,客戶什么都沒收到; 這是代碼

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),請告訴我。

我需要幫助

你不能有

多客戶端服務器體系結構中服務器上的public static Socket socket 服務器以“接受”方法創建客戶端套接字。

考慮多個客戶端連接到單個服務器的情況。 如果服務器上有靜態套接字,則它只能作為服務器套接字。 那么如何處理“ N”個連接到服務器的客戶端?

  1. 刪除Servidor中的靜態套接字

  2. 在accept()方法之后創建套接字時,將套接字傳遞給需要套接字的leer()escribir()方法。

如果您能夠在C#服務中托管服務器,那么我已經創建了一個開放項目,該項目支持1000多個連接,其中包括保持活動協議(AKA心跳協議),可以輕松擴展的身份驗證模型以及Java, Objective-C和C#API。 該文檔包含適用於Android,iOS和Windows Mobile的示例。 你可以在這里找到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM