2010-02-28 8 views
1

Dans mon programme, je souhaite envoyer des informations à un autre ordinateur avec des sockets. Le premier socket envoie du texte au serveur et lorsque le second socket reçoit cette information, il envoie une réponse à la première socket. Le problème est qu'un autre thread reçoit la réponse et la seule chose que je reçois est l'impasse. Ceci est le côté serveur:Threads, Sockets and Streams

else if(msgArray[0].compareTo("game_request") == 0){ 
       if(userMap.containsKey(msgArray[1])){ 
        Socket socketPlayerTwo = userMap.get(msgArray[1]); 
        otherPlayer = msgArray[1]; 
        sendResult(socketPlayerTwo, "game_offer?"+username); 
        Boolean willPlay =Boolean.valueOf(recieveRequest(socketPlayerTwo).split("?")[1]); 
        if(willPlay) 
         playingUser.put(username,msgArray[1]); 
        sendResult(socket, "game_accept?"+willPlay); 

       } 
      } 

Ceci est le côté client:

private void showGameRequest(String usernameOther) { 
     try{ 
      int status = GameWindow.getInstance().showNotification("Game Offer","The user " + usernameOther + " offers you a game!\nDo you agree?",SWT.ICON_QUESTION|SWT.YES|SWT.NO); 
      if (status == SWT.YES){ 
       otherPlayer = usernameOther; 
       sendRequest("send_message_to_user?user="+usernameOther+"&value=true"); 
       GameWindow.getInstance().getDisplay().asyncExec(new Runnable() { 

        @Override 
        public void run() { 
         GameWindow.getInstance().startNewGame(); 

        } 
       }); 
      } 
      else 
       sendRequest("send_message_to_user?user="+usernameOther+"&value=false"); 
      } 
     catch (IOException exc){ 

     } 
    } 

Voici la méthode sendRequest:

private void sendResult(Socket socket,String request) throws IOException{ 
    DataOutputStream writer = new DataOutputStream(socket.getOutputStream()); 
    writer.writeUTF(request); 
    writer.flush(); 
} 

Le socket client est créée dans le classe Serveur

while (true) { 
     try { 
      Socket socket = serverSocket.accept(); 
      new GameThread(socket,databaseManager); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

et il est mis en hashmap lorsque l'utilisateur passe le niveau de connexion:

if(msgArray[0].compareTo("user_info") == 0){ 
       Integer flagUser = -1; 
       String[] userInfo = {msgArray[1].substring(msgArray[1].indexOf("=") + 1, msgArray[1].indexOf("&")),msgArray[1].substring(msgArray[1].lastIndexOf("=")+ 1, msgArray[1].indexOf(";"))}; 
       Boolean status = databaseManager.checkUser(userInfo[0], userInfo[1]); 
       if(status){ 
        if(!userMap.containsKey(userInfo[0])){ 
         userMap.put(userInfo[0], socket); 
         username = userInfo[0]; 
         flagUser = 0; 
        } 
        else 
         flagUser = 1; 
       } 
       sendResult(socket, "user_info_status?"+flagUser.toString()+""); 
      } 

Je sais que je quelle est la raison de l'impasse, mais je ne peux pas le résoudre. Lorsque le premier utilisateur envoie l'information à l'autre utilisateur, il attend la réponse. Bien sûr, l'autre utilisateur envoie une réponse mais cette réponse est prise en charge par un autre thread. Donc le blocage provient d'une méthode de lecture qui bloque le fil. Comment puis-je envoyer des informations d'une socket à une autre sans blocage?

public GameThread(Socket socket, DatabaseManager databaseManager) { 
    this.socket = socket; 
    this.databaseManager = databaseManager; 
    parser = new RequestParser(); 
    authorizationControl = new AuthorizationControl(databaseManager); 
    communication = new SocketCommunication(socket); 
    start(); 
} 
+0

vous auriez besoin d'afficher les fonctions sendRequest(), sendResult() et comment le socket est créé et placé dans la userMap. – beny23

Répondre

0

Pourriez-vous nous indiquer plus de code?

sendResult(socketPlayerTwo, "game_offer?"+username); 
recieveRequest(socketPlayerTwo); 
sendRequest("send_message_to_user?user="+usernameOther+"&value=true"); 

pour les débutants. A en juger par le peu que je vois, vous avez un problème avec l'ordre dans lequel vous les utilisez. Autant que je peux dire que vous avez une méthode inputSteram.readObject() qui a bloqué quelque part en attente d'un message de l'autre côté.

+0

A en juger par le code que vous avez collé ci-dessous, je vois plusieurs erreurs possibles: 1) Dès que vous avez créé un objet OutputStream pour le flux de sortie du socket, vous devez le vider afin d'envoyer au client les en-têtes de flux. Cela débloquera la méthode read ..() éventuellement bloquée du flux d'entrée du client. – pnt

+0

2) Je vois que dès que vous acceptez une connexion, vous créez un objet de type GameThread. Pourriez-vous ajouter le corps du constructeur comme commentaire à votre réponse ci-dessous? Les problèmes possibles que vous pourriez avoir avec cela consiste simplement à créer un objet (je suppose à partir d'une classe qui étend Thread) ne déclenche rien, sauf explicitement l'indiquer. Je pense que vous vouliez dire nouveau GameThread (..). Start(); – pnt

+0

Le problème est que le client doit attendre la demande de jeu d'un autre client. Bien sûr, il peut commencer le jeu manuellement. Un client peut demander à partir du thread d'affichage la liste d'utilisateurs actuelle du serveur. Cela se produit condition de course des threads et la méthode doit attendre le thread client pour recevoir la liste et après cela pour le renvoyer. Dans ce jeu, il y a beaucoup de demandes du thread d'affichage, c'est pourquoi je ne veux pas utiliser un thread dans le client. Mais voici le problème d'attendre une demande de jouer. C'est mon gros problème et je serai très reconnaissant si quelqu'un m'aide avec ça. –