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) 个答案