照着书敲的,但是运行结果不对。能不能劳烦各位帮看看。一共四个类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){}
}
}
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){}
}
}
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){}
}
}
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();
}
}
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;
}}