2013-11-28 2 views
0

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

Сервер:

public void allowConnections(){ 
    int i = 0; 
    try{ 
     while(true){              
      new Thread(new TestT(draughtsSS.accept(),i)).start();   //listen for incoming connections  
      i++; 
     } 
    } 
    catch(IOException e){ 
     System.out.println("Error :"+e.getMessage()); 
    } 
} 


class TestT implements Runnable{ 

    Socket s; 
    int gameNo; 
    Scanner in; 
    ObjectInputStream objectIn; // for retrieving new color array (down s socket) 
    ObjectOutputStream out; 
    PrintWriter outPW; 
    //String Player1; 
    //String Player2; 
    String playerIP; 
    String opponentIP; 
    int port = 50000; 

    TestT(Socket s, int gameNo){ 
     this.s = s; 
     this.gameNo = gameNo; 
    } 
    public void run(){ 

     try{ 
      outPW = new PrintWriter(s.getOutputStream(), true); 
      out = new ObjectOutputStream(s.getOutputStream()); 
      out.writeObject(list); 
      in = new Scanner(s.getInputStream()); 
      outPW.println("returnIP");       ///get the IP of the client 
      clientIPArray.add(in.nextLine());      /// add it to the clientIPArray 
     } 
     catch(IOException e){ 
      e.getStackTrace(); 
     } 
     JOptionPane.showMessageDialog(new JFrame(), s.getInetAddress().toString() +" has connected.");    
     list[gameNo] = "Game "+Integer.toString(gameNo); 
     gamesList.updateUI(); 

     } 
    } 

}

private void setupConnection(String serverIP, String port){ 
    int portInt = Integer.parseInt(port); 
    serverIp = serverIP; 
    try{ 
     IP = InetAddress.getByName(serverIP); 
     clientSocket = new Socket(IP,portInt); 
     JOptionPane.showMessageDialog(new JFrame(), "Successfully connected to Server"); 
     in = new ObjectInputStream(clientSocket.getInputStream()); 
     out = new PrintWriter(clientSocket.getOutputStream(), true); 
     scanIn = new Scanner(clientSocket.getInputStream()); 
     a = (String[]) in.readObject(); 
     if(scanIn.nextLine().equals("returnIP"))out.println(clientIp); 
     getGamesList(a); 
     Thread tss = new Thread(new ClientThread()); 
     tss.start(); 
     System.out.println("w"); 
    } 
    catch(Exception e){ 
     System.out.println("ErrorC :" +e.getMessage()); 
    } 
} 

ответ

0

Предложения:

  • Keep пару буферов на стороне сервера, обновить их на входе клиентов и передавать данные, когда другой клиент подключен

  • Пусть сервер будет ждать, пока два клиента будут подключены, а затем перенаправит InputStream каждого Socket в OutputStream другого.

  • Пусть сервер ждать, пока не будут подключены два клиента, а затем передавать как клиентам адрес другого, пусть им общаться p2p (без сервера)

  • Любая комбинация из вышеперечисленных

Лучший способ зависит от ваших целей.

+0

Говоря о предложениях, я бы использовал [Thrift] (http://thrift.apache.org/) или другую зрелую структуру, чтобы сделать для вас грязную работу. –

+0

Спасибо за обмен полезной ссылкой! Я не думаю, что это проще, чем писать на java, но я буду иметь в виду) –

+0

спасибо за предложения, теперь я пытаюсь получить массив, это законно? else if (Color []) objectIn.readObject() instanceof Color []) {// сделать что-то} –

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