2010-02-04 46 views
0

基本上我有一个基本的Java Socket服务器,如下所示。它允许多个用户进行连接,并在他们发送消息时将其返回。但是我想知道如何编辑它,所以如果用户向它发送消息,而不是仅仅发送回它将它发送给所有连接的人?所以基本的聊天服务器。任何帮助将不胜感激:)如何将消息发送给多个用户?

import java.awt.Color; 
import java.awt.BorderLayout; 
import java.awt.event.*; 
import javax.swing.*; 

import java.io.*; 
import java.net.*; 

class ClientWorker implements Runnable { 
    private Socket client; 
    private JTextArea textArea; 

    ClientWorker(Socket client, JTextArea textArea) { 
    this.client = client; 
    this.textArea = textArea; 
    } 

    public void run(){ 
    String line; 
    BufferedReader in = null; 
    PrintWriter out = null; 
    try{ 
     in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     out = new PrintWriter(client.getOutputStream(), true); 
    } catch (IOException e) { 
     System.out.println("in or out failed"); 
     System.exit(-1); 
    } 

    while(true){ 
     try{ 
     line = in.readLine(); 
//Send data back to client 
     out.println(line); 
     textArea.append(line); 
     } catch (IOException e) { 
     System.out.println("Read failed"); 
     System.exit(-1); 
     } 
    } 
    } 
} 

class SocketThrdServer extends JFrame{ 

    JLabel label = new JLabel("Text received over socket:"); 
    JPanel panel; 
    JTextArea textArea = new JTextArea(); 
    ServerSocket server = null; 

    SocketThrdServer(){ //Begin Constructor 
    panel = new JPanel(); 
    panel.setLayout(new BorderLayout()); 
    panel.setBackground(Color.white); 
    getContentPane().add(panel); 
    panel.add("North", label); 
    panel.add("Center", textArea); 
    } //End Constructor 

    public void listenSocket(){ 
    try{ 
     server = new ServerSocket(4444); 
    } catch (IOException e) { 
     System.out.println("Could not listen on port 4444"); 
     System.exit(-1); 
    } 
    while(true){ 
     ClientWorker w; 
     try{ 
     w = new ClientWorker(server.accept(), textArea); 
     Thread t = new Thread(w); 
     t.start(); 
     } catch (IOException e) { 
     System.out.println("Accept failed: 4444"); 
     System.exit(-1); 
     } 
    } 
    } 

    protected void finalize(){ 
//Objects created in run method are finalized when 
//program terminates and thread exits 
    try{ 
     server.close(); 
    } catch (IOException e) { 
     System.out.println("Could not close socket"); 
     System.exit(-1); 
    } 
    } 

    public static void main(String[] args){ 
     SocketThrdServer frame = new SocketThrdServer(); 
    frame.setTitle("Server Program"); 
     WindowListener l = new WindowAdapter() { 
       public void windowClosing(WindowEvent e) { 
         System.exit(0); 
       } 
     }; 
     frame.addWindowListener(l); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.listenSocket(); 
    } 
} 

回答

0

您可以通过提供一个持有人来容纳所有客户端添加一点修改。可以是List实现。然后,您可以编写广播方法并调用该方法,而不是out.println()。在这种方法中,你会按照这种方式做类似的事情。

此外,您应该查看Observer Pattern以有效实施此功能,此外您还将对设计模式有很好的理解。另一种有用的模式是Mediator Pattern

+0

对不起,如果这听起来很粗鲁,但我会怎么做呢?我对Java很陌生,而且我正在构建一个服务器来与另一个项目一起使用,这是最后一点,我真的想完成它:) – Ozzie 2010-02-04 10:07:35

+0

不知道你的整体设计,我不能为你提供任何确切的建议。所以,看看这里http://www.codeproject.com/KB/IP/c_sharp_remoting.aspx。它是基于Observer模式使用.NET的聊天应用程序示例。肯定会给你一个很好的提示。 – 2010-02-04 10:12:27

+0

好的,谢谢!我会看一看!。这是整个程序哈哈 – Ozzie 2010-02-04 10:50:09

0

每次创建listenSocketClientWorker,保持所有的客户端工人有权访问列表到客户端的引用(无论是在全球还是 - 最好 - 传递到他们在创建时)。当客户收到一条消息时,它可以在列表中循环并将消息发回给每个工作人员。在添加/删除/遍历这个列表时,你需要小心,因为你将会运行很多线程,这些线程都可以在同一时间尝试并访问它。

此外,为了正确起见,您应该从EDT而不是从客户端线程访问Swing组件(例如textArea.appendClientWorker)。查看javadocs的SwingUtilities.invokeLater

相关问题