2012-09-23 26 views
6

Bunu bir süredir deniyorum ve birden çok istemcinin aynı anda birden fazla giriş yapmasını istiyorum.
Bir sorun varsa, bir istemcinin 'print2all Hi' yazması durumunda sunucunun tüm istemcilere "Merhaba" yazmasını istiyorum.
Yazdırmak için nasıl işlediğini biliyorum, sadece TÜM istemcilere yazdırmak sorun.Soketli bir Java sunucusu oluşturdum, sadece TÜMÜ yuvalara nasıl yazdırıyorsunuz?

Şimdiye kadar sahip olduğum şeyler.
Sunucu

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(); 
} 

Müşteri

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

Guys. Eğer bir marş sunucusu olarak bu kullanmak istiyorsanız, hepinizin bağlı istemciler takip etmek gerek tam izni = P

cevap

5

İlk vermek: Bir istemci "print2all Hi" basitçe yineler alırsa

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

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

böyle listesine sahip olmak Tüm clients üzerinde ve her birine mesaj gönderir. Bunu yapmak için büyük olasılıkla, istemci soketine erişecek olan SocketThread'daki bazı yöntemleri açıklamanız gerekecektir. Bu, alana out değişkenini değiştirmek zorunda kalacağınız anlamına gelir.

Alternatif yaklaşım, istemci soketlerinin bir listesini tutmaktır. Ancak bu, kapsüllemeyi kötü bir şekilde bozar. Soketler doğrudan maruz kalıyorsa, kötü IO/iplik güvenliği sorunlarına da girebilirsiniz. Bunları bazı API'nin arkasına saklayın (SocketThread yöntemi gibi) ve senkronizasyonu düzgün bir şekilde yapın.

+1

ve yayın yapan biri. –

+0

@ChristopheBiocca: Haklısınız, ancak OP'in çok daha basit sorunları var gibi görünüyor. Ancak iplik güvenliği hakkında konuşacağım, teşekkürler! –

+0

+1 Eşzamanlılık kütüphanesinden bir koleksiyon kullanırsanız, listeyi korumak için parçacığı ekleyebilir ve sonunda soketi çıkartabilirsiniz. Bağlantıların durumunu iyi şekilde alabileceğiniz için bağlantı işleyicisinin eklenmesi ve çıkarılması daha yararlıdır. –

1

Aradığınızı tam olarak uygulayın.

Sunucu

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); 
      } 
     } 
    } 
} 

Müşteri Sana soket sahibi soket iplikten eşzamanlı baskı ile bitirmek böylece prizler, gerçi parçacığı güvenli olduğunu sanmıyorum

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(); 
      } 
     }); 
    } 
}