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();
}
vous auriez besoin d'afficher les fonctions sendRequest(), sendResult() et comment le socket est créé et placé dans la userMap. – beny23