2012-09-23 34 views
6

Tôi đã thử điều này một thời gian và tôi muốn nhiều khách hàng nhận nhiều đầu vào đồng thời.
Có một vấn đề, tôi muốn máy chủ in "Hi" cho tất cả khách hàng nếu một khách hàng nói 'print2all Hi'.
Tôi biết cách xử lý nó để in nó, chỉ để in cho TẤT CẢ khách hàng là vấn đề.Tôi đã tạo một máy chủ Java có ổ cắm, chỉ cần in tới ALL socket?

Đây là những gì tôi có cho đến nay.
server

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

Khách hàng

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

Guys. Nếu bạn muốn sử dụng như một máy chủ khởi động, tôi cung cấp cho đầy đủ cho phép = P

Trả lời

5

Trước tiên, bạn cần phải theo dõi tất cả các khách hàng kết nối:

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

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

Có danh sách như vậy nếu một khách hàng nhận "print2all Hi" nó chỉ đơn giản lặp trên tất cả clients và gửi tin nhắn cho mỗi người trong số họ. Để thực hiện điều này, bạn có thể phải phơi bày một số phương thức trên SocketThread sẽ truy cập vào ổ cắm máy khách. Điều này có nghĩa là bạn sẽ phải thay đổi biến số out thành trường.

Cách tiếp cận khác là giữ danh sách các ổ cắm máy khách. Nhưng điều này phá vỡ đóng gói nặng. Ngoài ra bạn có thể chạy vào các vấn đề IO/thread-an toàn khó chịu nếu ổ cắm được tiếp xúc trực tiếp. Tốt hơn nên ẩn chúng sau một số API (như phương pháp SocketThread) và thực hiện đồng bộ hóa đúng cách bên trong.

+1

Tôi không nghĩ rằng ổ cắm là chủ đề an toàn mặc dù, vì vậy bạn có thể kết thúc với in ấn đồng thời từ các luồng khe kết nối sở hữu ổ cắm và phát sóng. –

+0

@ChristopheBiocca: bạn nói đúng, nhưng OP dường như có nhiều vấn đề đơn giản hơn nhiều. Tuy nhiên tôi sẽ đề cập đến về an toàn thread, cảm ơn! –

+0

+1 Nếu bạn sử dụng một bộ sưu tập từ thư viện tương tranh, bạn có thể thêm chuỗi và cuối cùng loại bỏ các ổ cắm để duy trì danh sách. Có khả năng là việc thêm và gỡ bỏ trình xử lý của kết nối sẽ hữu ích hơn khi bạn có thể nhận được trạng thái của các kết nối tốt. –

1

Thực hiện đầy đủ những gì bạn đang tìm kiếm.

server

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

Khách hàng

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(); 
      } 
     }); 
    } 
} 
Các vấn đề liên quan