2016-04-13 18 views
1

Her müşterinin, her biri yeni bir iş parçacığı olan bir soketten bağlandığını anlıyorum, ancak verileri belirli bir istemci soketine nasıl gönderirim? Bu sorunu çözmek için ne yapmalıyım? Bağlantılı bir listede sunucusuna bağlanan tüm kullanıcıların kaydetmek ve bunu da her istemci bağlantısını geçebilirVerileri belirli Soket bağlantılarına nasıl gönderirim?

package server; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.*; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class Server { 
    public Server() throws IOException { 
     ServerSocket ss = new ServerSocket(1124); 
     ExecutorService executorService = Executors.newFixedThreadPool(100); 
     System.out.println("Server is running"); 

     while (true) { 
      Socket s = ss.accept(); 
      executorService.execute(new ConnectionHandler(s));  
     }  
    } 

    public static void main(String[] args) throws IOException { 
     new Server(); 
    }  
} 

class ConnectionHandler implements Runnable {  
    Socket s; 

    public ConnectionHandler(Socket s) { 
     this.s = s; 
    } 

    @Override 
    public void run() {  
     try { 
      BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
      PrintWriter out = new PrintWriter(s.getOutputStream(), true); 
     } catch (IOException ex) { 
      Logger.getLogger(ConnectionHandler.class.getName()).log(Level.SEVERE, null, ex); 
     }  
    } 
} 
+0

Eğer inputStream bir çıkış göndermek istediğiniz aynı soket olmalıdır emin misiniz? –

+0

aslında, nasıl Soket (Müşteri bir) ve Soket (Müşteri 2) ayırt edersiniz? ... seni takip etmelidir Müşteriye Müşteri 2 iplik çalıştıran bir soket ... – IamTryingHard

+0

veri göndermek nasıl bütün senin ConnectionHandler, bir Listeye ihtiyacınız var ve bunu kabul ettikten sonra ona bir bağlantı ekleyin. bu şekilde belirli bir müşteriye mesaj gönderebilirsiniz, ancak ConnectionHandler'ınızı değiştirmeniz gerekir, çünkü orada hiçbir şey yapmaz. – Reza

cevap

0

: İşte benim sunucunun kaynak kodudur. Bu şekilde iletişim kurmak istediğiniz bağlantıyı bulmak ve outputstream ürününe veri göndermek için bağlantılı listeden geçiş yapabilirsiniz. Sunucu için

DÜZENLEME örnek-

Kodu:

import java.io.IOException; 
import java.net.Socket; 
import java.net.ServerSocket; 
import java.util.LinkedList; 
import java.util.List; 

public class DBServer { 
    static boolean listening = true; 
    private static ServerSocket serverSocket = null; 
    private static Socket clientSocket = null; 
    static List<ClientThread> users = null; 

    public static void main(String[] args) { 
    users= new LinkedList(); 
    int portNumber = 17000; 
    System.out.println("Now using port number=" + portNumber); 
    try { 
     serverSocket = new ServerSocket(portNumber); 
    } catch (IOException e) { 
     System.out.println(e); 
    } 

    while (listening) { 
     try { 
      System.out.println("Number of users connected: " + users.size()); 
      clientSocket = serverSocket.accept(); 
      System.out.println("Someone just joined."); 
      ClientThread ct= new ClientThread(clientSocket); 
      users.add(ct); 
      ct.start(); 
     }catch (IOException e) { 
      System.out.println(e); 
     } 
    } 
    } 
} 

Sunucu, istemci iş parçacığı tarafından erişilebilir List<ClientThread> users değişkenin bağlı kullanıcıların bir listesini tutar.

ClientThread Kodu:

public class ClientThread implements Runnable { 
private Socket clientSocket = null; 
ClientThread(Socket s){ 
    this.clientSocket= s; 
    //give this thead a unique identifier like a name using this.setName() method 
} 
void sendMessage(){ 
    for (ClientThread c : DBServer.users) { 
     if(c.getName().equals(/*Name of thread you want to contact*/)){ 
      //send message here 
     } 
    } 
} 
} 

this.setName() yöntemi kullanılarak telin bir isim belirleyin. Benzersiz bir tanımlayıcı olmalıdır.
Artık getName() yöntemini kullanarak tüm users değişkenini kullanarak geçiş yapıp geçiş yapabilirsiniz.

+0

lütfen basit bir örnek verebilir misiniz ... Teşekkür ederim. – IamTryingHard

+0

@IamTryingHard tamamlandı –