照着书敲的,但是运行结果不对。能不能劳烦各位帮看看。一共四个类ChatClient,ChatHandler,ChatServer,Message.====================================================================
package chatroom;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class ChatClient extends Thread implements ActionListener{
JTextField messageField,IDField,ipField,portField;
JTextArea message,users;
JButton connect,disconnect;
String user = "";
String userList[] = new String[10];
Socket theSocket;
BufferedReader in;
PrintWriter out;
boolean connected = false;
Thread thread;
public static void main(String args[]){
JFrame frame = new JFrame("聊天室");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ChatClient cc = new ChatClient();
JPanel content = cc.createComponents();
frame.getContentPane().add(content);
frame.setSize(550,310);
frame.setVisible(true);
}

public JPanel createComponents(){
JPanel pane = new JPanel(new BorderLayout());
message = new JTextArea(10,35);
message.setEditable(false);
JPanel paneMsg = new JPanel();
paneMsg.setBorder(BorderFactory.createTitledBorder("聊天内容"));
paneMsg.add(message);
users = new JTextArea(10,10);
JPanel listPanel = new JPanel();
listPanel.setBorder(BorderFactory.createTitledBorder("在线用户:"));
listPanel.add(users);
messageField = new JTextField(50);
IDField = new JTextField(5);
ipField = new JTextField("LocalHost");
portField = new JTextField("8189");
connect = new JButton("连  接");
disconnect = new JButton("断  开");
disconnect.setEnabled(false);
JPanel buttonPanel = new JPanel();
buttonPanel.add(new Label("服务器IP:"));
buttonPanel.add(ipField);
buttonPanel.add(new Label("端口:"));
buttonPanel.add(portField);
buttonPanel.add(new Label("用户名:"));
buttonPanel.add(IDField);
buttonPanel.add(connect);
buttonPanel.add(disconnect);
pane.add(messageField,"South");
pane.add(buttonPanel,"North");
pane.add(paneMsg,"Center");
pane.add(listPanel,"West");
connect.addActionListener(this);
disconnect.addActionListener(this);
messageField.addActionListener(this);
return pane;

}

public void actionPerformed(ActionEvent e){
if(e.getSource() == connect){
user = IDField.getText();
String ip = ipField.getText();
int port = Integer.parseInt(portField.getText());
if(!user.equals("") && connectToServer(ip,port,user)){
disconnect.setEnabled(true);
connect.setEnabled(false);
}
}
if(e.getSource() == disconnect){
disconncetFromServer();
}
if(e.getSource() == messageField){
if(theSocket != null){
out.println("MESSAGE:"+messageField.getText());
messageField.setText("");
}
}
}

public void disconncetFromServer(){
if(theSocket != null){
try{
connected = false;
out.println("LEAVE:"+user);
disconnect.setEnabled(false);
connect.setEnabled(true);
thread = null;
theSocket.close();
}catch(IOException io){}
theSocket = null;
message.setText("");
users.setText("");
}
}

public boolean connectToServer(String ip,int port,String ID){
if(theSocket != null){
return false;
}
try{
theSocket = new Socket(ip,port);
in = new BufferedReader(new InputStreamReader(theSocket.getInputStream()));
out = new PrintWriter(new OutputStreamWriter(theSocket.getOutputStream()),true);
out.println("USER:"+user);
message.setText("");
connected = true;
thread = new Thread(this);
thread.start();
}catch(Exception e){
return false;
}
return true;
}

public void extractMessage(String line){
System.out.println(line);
Message messageline;
messageline = new Message(line);
if(messageline.isValid()){
if(messageline.getType().equals("JOIN")){
user = messageline.getBody();
message.append(user+"加入聊天室\n");
}
else if(messageline.getType().equals("LIST")){
updateList(messageline.getBody());
}
else if(messageline.getType().equals("MESSAGE")){
message.append(messageline.getBody()+"\n");
}
else if(messageline.getType().equals("REMOVE")){
message.append(messageline.getBody()+"离开聊天室\n");
}
}
else{
message.append("出现问题:"+line+"\n");
}
}

public void updateList(String line){
users.setText("");
String str = line;
for(int i=0;i<10;i++){
userList[i] = "";
}
int index = str.indexOf(":");
int a = 0;
while(index != -1){
userList[a] = str.substring(0,index);
str = str.substring(index+1);
a++;
index = str.indexOf(":");
}
for(int i=0;i<10;i++){
users.append(userList[i]+"\n");
}
}

public void run(){
try{
String line = "";
while(connected && line!=null){
line = in.readLine();
if(line != null){
extractMessage(line);
}
}
}catch(IOException e){}
}

}

解决方案 »

  1.   

    package chatroom;
    import java.net.*;
    import java.io.*;
    public class ChatHandler extends Thread{
    Socket theSocket;
    BufferedReader in;
    PrintWriter out;
    int thePort;
    ChatServer parent;
    String user = "";
    boolean disconnect = false;

    public ChatHandler(Socket socket,ChatServer parent){
    try{
    theSocket = socket;
    this.parent = parent;
    in = new BufferedReader(new InputStreamReader(theSocket.getInputStream()));
    out = new PrintWriter(new OutputStreamWriter(theSocket.getOutputStream()),true);
    thePort = theSocket.getPort();
    start();
    }catch(IOException io){}
    }

    public void sendMessage(String line){
    out.println(line);
    }

    public void setupUserName(String setname){
    user = setname;
    parent.broadcastMessage("JOIN:"+user);
    }

    public void extractMessage(String line) {
    Message messageline;
    messageline = new Message(line);
    if (messageline.isValid()) {
    if (messageline.getType().equals("USER:")) {
    setupUserName(messageline.getType());
    parent.broadcastMessage("LIST:" + parent.returnUsernameList());
    } else if (messageline.getType().equals("MESSAGE")) {
    parent.broadcastMessage("MESSAGE:" + user + "说:"
    + messageline.getBody());
    } else if (messageline.getType().equals("LEAVE")) {
    String c = disconnectClient();
    parent.broadcastMessage("REMOVE:" + c);
    parent.broadcastMessage("LIST:" + parent.returnUsernameList());
    }
    } else
    sendMessage("命令不存在!");
    }

    public String disconnectClient(){
    try{
    in.close();
    out.close();
    theSocket.close();
    parent.removeConnectionList(this);
    disconnect = true;
    }catch(Exception ex){}
    return user;
    }

    public void run(){
    String line,name;
    boolean valid = false;
    try{
    while((line = in.readLine() )!= null){
    System.out.println("收到:"+line);
    extractMessage(line);
    }
    }catch(IOException io){}
    }
    }
      

  2.   

    package chatroom;
    import java.io.*;
    import java.net.*;
    public class ChatServer {
    final static int thePort = 8189;
    ServerSocket theServer;
    ChatHandler[] chatters;
    int numbers = 0;

    public ChatServer(){
    try{
    theServer = new ServerSocket(thePort);
    chatters = new ChatHandler[10];
    }catch(IOException io){}
    }

    public void run(){
    try{
    System.out.println("服务器已建立!");
    while(numbers < 10){
    Socket theSocket = theServer.accept();
    ChatHandler chatHandler = new ChatHandler(theSocket,this);
    chatters[numbers] = chatHandler;
    numbers++;
    System.out.println("客户端连接"+numbers);
    }
    }catch(IOException e){}
    }

    public synchronized void removeConnectionList(ChatHandler c){
    int index = 0;
    for(int i=0;i<=numbers-1;i++){
    if(chatters[i] == c)
    index = i;
    }
    for(int i=index;i<=numbers-1;i++){
    chatters[i] = chatters[i+1];
    chatters[numbers-1] = null;
    numbers--;
    }
    }

    public synchronized String returnUsernameList(){
    String line = "";
    for(int i=0;i<=numbers-1;i++){
    line = line+chatters[i].user+":";
    }
    return line;
    }

    public void broadcastMessage(String line){
    System.out.println("发布信息:"+line);
    for(int i=0;i<=numbers;i++){
    chatters[i].sendMessage(line);
    }
    }

    public static void main(String args[]){
    ChatServer app = new ChatServer();
    app.run();
    }
    }
      

  3.   

    package chatroom;public class Message {
    private String type;
    private String body;
    private boolean valid;
    public Message(String messageLine){
    valid = false;
    type = body = null;
    int pos = messageLine.indexOf(":");
    if(pos >= 0){
    type = messageLine.substring(0,pos).toUpperCase();
    body = messageLine.substring(pos+1);
    valid = true;
    }
    }

    public Message(String type,String body){
    valid = true;
    this.type = type;
    this.body = body;
    }

    public String getType(){
    return type;
    }

    public String getBody(){
    return body;
    }

    public boolean isValid(){
    return valid;
    }}