有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java使用AWT列表和socket在聊天室中发送直接消息

我正在使用Javasocket创建一个简单的聊天室,并在GUI中使用AWT组件。我拥有聊天室的所有功能,它向所有用户发送和接收信息,等等。。。其中一个要求是创建一个列表,在用户进入和离开聊天室时进行更新。我的解决方案是让服务器将处理程序的当前名称打印到一个文件中,然后客户端从文件中获取名称并将其添加到列表中。为了做到这一点,我做了一个方法,我把它放进了一个for(;)循环,以便在用户进入/离开聊天室时列表不断更新。这些要求都很好

我的问题是:下一个要求是:“用户应该能够从用户列表中选择一个用户。当选择了一个名称时,所有发送的消息都是私有的——只发送给该用户。”我不知道如何将所选名称返回到服务器,以便某人只能向所选用户名发送消息。我创建列表的方式是否可能做到这一点?如果是这样的话,你对如何做到这一点有什么想法吗?这几天我一直被难住了,现在我几乎在想,这是不可能的,我应该重新考虑我的列表逻辑。如果这是不可能的,你有什么更好的解决方案为我的名单

谢谢!

客户端文件:

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.ArrayList;

public class ClientFrame extends Frame{

    public ClientFrame(){
        setSize(500,500);
        setTitle("Chat Client");

        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent We){
                System.exit(0);
            }
        });

        add(new ClientPanel(new FrameContainer(this)), BorderLayout.CENTER);

        setVisible(true);
    }

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

} // end ClientFrame

class ClientPanel extends Panel implements ActionListener, Runnable, ItemListener{
    TextField tf;
    TextArea ta;
    List list;
    Button connect, disconnect;
    Socket socketToServer;
    PrintWriter pw;
    BufferedReader br;
    Thread t;
    String userName;
    FrameContainer fc;

    public ClientPanel(FrameContainer fc){
        setLayout(new BorderLayout());
        tf = new TextField();
        ta = new TextArea();
        list = new List();
        this.fc = fc;
        connect = new Button("Connect");
        disconnect = new Button("Disconnect");
        Panel bPanel = new Panel();
        bPanel.add(connect);
        disconnect.setEnabled(false);
        bPanel.add(disconnect);
        
        tf.addActionListener(this);
        connect.addActionListener(this);
        disconnect.addActionListener(this);
        list.addItemListener(this);

        add(tf, BorderLayout.NORTH);
        add(ta, BorderLayout.CENTER);
        add(list, BorderLayout.EAST);
        add(bPanel, BorderLayout.SOUTH);        
        
    } // end ClientPanel constructor

    public void actionPerformed(ActionEvent ae){
        if (ae.getSource() == tf){
            String temp = tf.getText();
            pw.println(userName+": "+temp);
            tf.setText("");
        } else if (ae.getSource() == connect){
            if(tf.getText() == null || tf.getText().equals("")){
                    ta.append("Must enter a name to connect\n");
                }else { 
                    setUsername(tf.getText());
                    fc.getFrame().setTitle(userName);
                    connect.setEnabled(false);
                    disconnect.setEnabled(true);
                    tf.setText("");     
                    try{
                        socketToServer = new Socket("127.0.0.1", 3000);
                        pw = new PrintWriter(new OutputStreamWriter
                                (socketToServer.getOutputStream()), true);
                        br = new BufferedReader(new InputStreamReader
                                (socketToServer.getInputStream()));
                    }catch(UnknownHostException uhe){
                        System.out.println(uhe.getMessage());
                    }catch(IOException ioe){
                        System.out.println(ioe.getMessage());
                    } 
                }
                    t = new Thread(this);
                    t.start();
                    pw.println(userName);
                    pw.println(userName +" has entered the chat.");
                    
        }else if (ae.getSource() == disconnect){
            try{
                pw.println(userName +" has left the chat.");
                list.removeAll();
                fc.getFrame().setTitle("Chat Client");
                t.interrupt();
                br.close();
                pw.close();
                socketToServer.close();
                connect.setEnabled(true);
                disconnect.setEnabled(false);
            }catch(IOException ioe){
                System.out.println(ioe.getMessage());
            }
        }
    } // end actionPerformed

    public void itemStateChanged(ItemEvent ie){
            if(ie.getStateChange() == ItemEvent.SELECTED){
                String user = list.getSelectedItem();


            }else if(ie.getStateChange() == ItemEvent.DESELECTED){
                break;
            }

    } // end itemStateChanged

    public void run(){
            try {
                for (;;) {

                    if(socketToServer.isClosed() == true) {
                        break;
                    }
                    setList();
                    try {
                        String temp = br.readLine();
                        ta.append(temp + "\n");

                    } catch (IOException ioe) {
                        System.out.println(ioe.getMessage());

                    }
                    Thread.sleep(10);
                }
            } catch (InterruptedException e) {
                System.out.println("Disconnected.");
            }
    } // end run

    public void setList(){
        list.removeAll();
        try{
            BufferedReader br = new BufferedReader(
                    new FileReader("onlinelist.txt"));
            String line;
            while((line = br.readLine()) != null){
                this.list.add(line);            
            }
                br.close();
        }catch(FileNotFoundException fnfe){
            System.out.println(fnfe.getMessage());
        }catch(IOException ioe){
            System.out.println(ioe.getMessage());
        }

    } // end setList

    public void setUsername(String userName){
        this.userName = userName;
    }

    public String getUsername(){
        return userName;
    }

    

} // end ClientPanel


// Container class to change title of frame

class FrameContainer{
    ClientFrame f;

    public FrameContainer(ClientFrame f){
        setFrame(f);    
    }

    public ClientFrame getFrame(){
        return f;
    }
    public void setFrame(ClientFrame f){
        this.f = f;
    }
}

服务器文件:

import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.awt.*;

public class ThreadedServerWithPresence{  
    public static void main(String[] args){  
        ArrayList<ThreadedHandlerWithPresence> handlers;
            try{    
            handlers = new ArrayList<ThreadedHandlerWithPresence>();
            ServerSocket s = new ServerSocket(3000);
                for(;;){  
                Socket incoming = s.accept();
                new ThreadedHandlerWithPresence(incoming, 
                                    handlers).start();
                }   
            }catch (Exception e){  
                System.out.println(e);
            }
    } 
}

class ThreadedHandlerWithPresence extends Thread{  

    Socket incoming;
    ArrayList<ThreadedHandlerWithPresence> handlers;
    PrintWriter pw;
    BufferedReader br;
    String userName;
    ArrayList<String> list;

    public ThreadedHandlerWithPresence(Socket i,
        ArrayList<ThreadedHandlerWithPresence> handlers){ 
        incoming = i;
        this.handlers = handlers;
        handlers.add(this);
        list = new ArrayList<String>();
    }

    public void setUserName(String userName){
        this.userName = userName;
    }

    public String getUserName(){
        return userName;
    }


   
    public void run(){  
        try{    
            br = new BufferedReader(new InputStreamReader
                            (incoming.getInputStream()));

            pw = new PrintWriter(new OutputStreamWriter
                            (incoming.getOutputStream()),true);
           
            setUserName(br.readLine());
            createList();

            for(;;){

                String temp = br.readLine();
                if(temp == null)
                break;              

                System.out.println("Message read: " + temp);
                
                    for(int i = 0; i < handlers.size(); i++){
                        handlers.get(i).pw.println(temp);
                    }
                
            }           
            }catch (Exception e){  
                System.out.println(e);
            }finally{
                handlers.remove(this);
                createList(); 
            } 
    }

    public void createList(){
            try{
                PrintWriter p = new PrintWriter(
                    new FileWriter("onlinelist.txt"));
                for(int i = 0; i < handlers.size(); i++){
                    p.println(handlers.get(i).getUserName());                   
                }
                p.close();
            }catch(IOException ioe){
                System.out.println(ioe.getMessage());
            }
    }
}

共 (0) 个答案