2012-09-23 25 views
6

मैं थोड़ी देर के लिए यह कोशिश कर रहा हूं, और मैं चाहता हूं कि कई क्लाइंट एक साथ कई इनपुट प्राप्त करें।
एक समस्या है, मैं चाहता हूं कि सर्वर सभी ग्राहकों को "हाय" प्रिंट करे, यदि कोई ग्राहक 'print2all Hi' कहता है।
मुझे पता है कि इसे प्रिंट करने के लिए इसे कैसे संसाधित करना है, बस सभी ग्राहकों को प्रिंट करने के लिए समस्या है।मैंने सॉकेट के साथ एक जावा सर्वर बनाया है, बस सभी सॉकेट को प्रिंट कैसे करें?

यहां तक ​​कि मेरे पास अब तक है।
सर्वर

try{ 
    try{ 
     server = new ServerSocket(25565); 
    } catch (Exception e){ 
     e.printStackTrace(); 
    } 
    while (isListening){ 
     new SocketThread(server.accept()).start(); 
    } 
    server.close(); 
} catch (Exception e){ 
    e.printStackTrace(); 
} 

SocketThread

try { 
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

    String inputLine, outputLine; 
    Processor kkp = new Processor(); 
    out.println("Hi!"); 

    while ((inputLine = in.readLine()) != null) { 
     outputLine = kkp.Proccess(inputLine,this.socket); 
     out.println(outputLine); 
    } 
    out.close(); 
    in.close(); 
    socket.close(); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 

ग्राहक

  Processor p = new Processor(); 
      socket = new Socket("localhost",25565); 
      out = new PrintWriter(socket.getOutputStream(), true); 
      in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
  BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); 
      String fromServer; 
      String fromUser; 

      out.println("print2all Hi") 

      socket.close(); 

दोस्तों। आप एक स्टार्टर सर्वर के रूप में उपयोग करना चाहते हैं, मैं पूरी अनुमति = पी

उत्तर

5

पहले दे आप सभी जुड़े हुए ग्राहकों का ट्रैक रखने की जरूरत है:

final List<SocketThread> clients = new ArrayList<>(); 

while (isListening){ 
    SocketThread client = new SocketThread(server.accept()).start(); 
    clients.add(client); 
} 

यदि एक ग्राहक "print2all Hi" यह बस दोहराता प्राप्त करता है इस तरह के सूची होने सभी clients पर और उनमें से प्रत्येक को संदेश भेजता है। ऐसा करने के लिए आपको SocketThread पर कुछ विधि का पर्दाफाश करना होगा जो क्लाइंट सॉकेट तक पहुंच जाएगा। इसका मतलब है कि आपको क्षेत्र में out परिवर्तनीय बदलना होगा।

वैकल्पिक दृष्टिकोण क्लाइंट सॉकेट की सूची रखना है। लेकिन यह बुरी तरह से encapsulation तोड़ता है। यदि सॉकेट सीधे सामने आते हैं तो आप भी खराब आईओ/थ्रेड-सुरक्षा मुद्दों में भाग सकते हैं। उन्हें कुछ एपीआई (जैसे SocketThread विधि) के पीछे बेहतर छुपाएं और सिंक्रनाइज़ेशन को ठीक से अंदर करें।

+1

मुझे लगता है कि नहीं है कि सॉकेट ताकि आप सॉकेट धागा सॉकेट मालिक से समवर्ती मुद्रण लग सकती है, धागा सुरक्षित हैं, हालांकि और एक प्रसारण। –

+0

@ क्रिस्टोफबीओकाका: आप सही हैं, लेकिन ओपी में बहुत सरल समस्याएं प्रतीत होती हैं। हालांकि मैं थ्रेड-सुरक्षा के बारे में उल्लेख करूंगा, धन्यवाद! –

+0

+1 यदि आप concurrency लाइब्रेरी से संग्रह का उपयोग करते हैं, तो आप सूची को बनाए रखने के लिए थ्रेड जोड़ सकते हैं और आखिरकार सॉकेट को हटा सकते हैं। ऐसा लगता है कि कनेक्शन के हैंडलर को जोड़ना और निकालना अधिक उपयोगी है क्योंकि आप कनेक्शन की स्थिति अच्छी तरह से प्राप्त कर सकते हैं। –

1

आप जो देख रहे हैं उसका पूर्ण कार्यान्वयन।

सर्वर

package tcpserver; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.StringTokenizer; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class TCPServer { 

    private int serverPort = 25565; 
    private ServerSocket serverSocket; 
    private List<ConnectionService> connections = new ArrayList<ConnectionService>(); 

    public TCPServer() { 
     try { 
      serverSocket = new ServerSocket(serverPort); 
      System.out.println("Waiting..."); 
      while (true) { 
       Socket socket = serverSocket.accept(); 
       System.out.println("Connected: " + socket); 
       ConnectionService service = new ConnectionService(socket); 
       service.start(); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    public static void main(String[] args) { 
     new TCPServer(); 
    } 

    class ConnectionService extends Thread { 

     private Socket socket; 
     private BufferedReader inputReader; 
     private PrintWriter outputWriter; 
     //private String username; 

     public ConnectionService(Socket socket) { 
      this.socket = socket; 
      try { 
       inputReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       outputWriter = new PrintWriter(socket.getOutputStream(), true); 
      } catch (IOException e) { 
       System.out.println(e.getMessage()); 
      } 
     } 

     @Override 
     public void run() { 
      while (true) { 
       try { 
        String receivedMessage = inputReader.readLine(); 
        System.out.println(receivedMessage); 
        StringTokenizer stoken = new StringTokenizer(receivedMessage); 
        String fargument = stoken.nextToken(); 
        if (fargument.equals("print2all")) { 
         this.sendToAnyone(stoken.nextToken()); 
        } 
       } catch (IOException ex) { 
        Logger.getLogger(TCPServer.class.getName()).log(Level.SEVERE, null, ex); 
       } catch (NullPointerException e) { 
        System.out.println(e.getMessage()); 
       } finally { 
        outputWriter.close(); 
       } 

      } 
     } 

     protected void sendMessage(String message) { 
      outputWriter.println(message); 
     } 

     private void sendToAnyone(String message) { 

      for (ConnectionService connection : connections) { 
       connection.sendMessage(message); 
      } 
     } 
    } 
} 

ग्राहक

package tcpclient; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 

public class tcpClient extends javax.swing.JFrame { 

    private Socket socket; 
    private BufferedReader inputReader; 
    private PrintWriter outputWriter; 

    public tcpClient() { 
     connectToServer(); 
    } 

    private void connectToServer() { 
     try { 
      socket = new Socket(InetAddress.getByName("localhost"), 25565); 
      inputReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      outputWriter = new PrintWriter(socket.getOutputStream(), true); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     new Thread() { 
      @Override 
      public void run() { 
       receiveData(); 
      } 
     }.start(); 
    } 

    private void receiveData() { 
     try { 
      while (true) { 
       System.out.println(inputReader.readLine()); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void sendData(String messageToSend) { 
     outputWriter.println(messageToSend); 
    } 

    public void closeSocket() { 
     if (socket != null) { 
      try { 
       socket.close(); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 

    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       tcpClient client = new tcpClient(); 
       client.sendData("print2all Hi"); 
       client.closeSocket(); 
      } 
     }); 
    } 
}