2 u010052030 u010052030 于 2013.05.06 11:57 提问

刚开始学习java ,自己写了一个聊天小程序,没报错但是有毛病,希望能帮忙问一下

刚开始学习java ,自己写了一个聊天小程序,没有报任何错误。测试时打开3个聊天小窗口 A,B,C,在A中输入文字,只在B中显示出来了,而且显示出了三句相同语句。查了好几个小时都没有查出来,希望高手能帮帮忙,看看是怎么回事,并且告诉我是通过什么方法找出来的。
以下是客户端和服务器端代码

客户端:
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;

public class MyChatClient extends Frame {

/**
 * @param args
 */
//设置窗口位置及大小
private static final int CHAT_LAYOUT_X = 300;
private static final int CHAT_LAYOUT_Y = 100;
private static final int CHAR_SIZE_X =500;
private static final int CHAR_SIZE_Y =500;
//设置文本框和文本域
private TextArea ta;
private TextField tf;

private DataInputStream dis = null;
private DataOutputStream dos = null;

private String message = "";
private boolean flag = false;
private Socket s ;

public static void main(String[] args) {
    // TODO Auto-generated method stub
    new MyChatClient().MyChatFrame();
}

//设置聊天室框架及基本相应事件
public void MyChatFrame(){

    this.setTitle("聊天室");
    this.setLocation(CHAT_LAYOUT_X,CHAT_LAYOUT_Y);
    this.setSize(CHAR_SIZE_X,CHAR_SIZE_Y);
    this.addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent e){
            disConnection();
            System.exit(0);
        }
    });
    ta = new TextArea();
    tf = new TextField();
    this.add(ta,BorderLayout.NORTH);
    this.add(tf,BorderLayout.SOUTH);
    this.pack();
    TfEvent te = new TfEvent();
    tf.addActionListener(te);
    this.setVisible(true);
    connecter();
    new Thread(new ReadThread()).start();   
}

class TfEvent implements ActionListener{

    public void actionPerformed(ActionEvent e){
        String str = tf.getText();
        ta.setText(ta.getText()+str+'\n');
        tf.setText("");
        try {
            dos.writeUTF(str);
            dos.flush();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        str = "";

    }
}

//连接服务器
public void connecter() {
        try {
            s = new Socket("127.0.0.1",6666);
            flag = true;
            dis = new DataInputStream(s.getInputStream());
            dos = new DataOutputStream(s.getOutputStream());
            //new Thread(new ReadThread()).start(); 

    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

private class ReadThread implements Runnable{

    public void run(){
        try {
            while(flag){
                message = dis.readUTF();
                ta.setText(ta.getText()+message+'\n');
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

private void disConnection(){
    try {
        if(dis!=null){dis.close();dis=null;}
        if(dos!=null){dos.close(); dos=null;}
        if(s!=null){s.close(); s=null;} 
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
}

}

服务器端:
import java.net.*;
import java.util.ArrayList;
import java.util.List;
import java.io.*;

public class MyChatServer {
private boolean bConnection = false;
private boolean flag = false;
private ServerSocket ss = null;
private Socket s = null;
private DataInputStream dis ;
private DataOutputStream dos ;
private List clients = new ArrayList();

public static void main(String[] args) {
    // TODO Auto-generated method stub
    new MyChatServer().myChat();
}   
public void myChat(){
    try {
        ss =new ServerSocket(6666);
        bConnection = true;
        while(bConnection){
            s = ss.accept();
            flag = true;
            ChatClient cc = new ChatClient(s);
            clients.add(cc);
            new Thread(cc).start();
        }
    }catch(IOException  e){
        e.printStackTrace();
    }
}   
//处理客户信息内部类
class ChatClient implements Runnable{
    Socket so = null;
    String message;
    public ChatClient(Socket s){
        try {
            this.so = s ;
            dis = new DataInputStream(so.getInputStream());
            dos = new DataOutputStream(so.getOutputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }       
    public void run(){
        try {
            while(flag){
                message = dis.readUTF();

                for(int i=0; i<clients.size(); i++){
                    ChatClient c = clients.get(i);
                    c.send(message);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
                try {
                    if(dis!=null){dis.close(); dis=null;}
                    if(dos!=null){dos.close(); dos=null;}
                    if(s!=null){s.close(); s=null;}
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }
    }
    public void send(String str){
        try {
                dos.writeUTF(str);
                dos.flush();                
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

}

4个回答

u010119943
u010119943   2013.05.06 17:05
已采纳

你用到了继承和接口,父类的输出可能被子类给覆盖了,你调试的时候仔细看看是不是这方法的问题;

hfmbook
hfmbook   2013.05.06 12:00

使用debug调试一下嘛!很容易检查出来错误的!最好发下错误消息...

u010052030
u010052030 没有提示任何的错误信息,我不会用debug %>_<%
大约 5 年之前 回复
ll89snowsboy
ll89snowsboy   2013.05.06 12:57

设计一个断点来查看一下在哪里出错了。。。

u010052030
u010052030 比较难为情 但是现在还不知道怎么用断点
大约 5 年之前 回复
u010590592
u010590592   2013.05.06 19:08

调试一下,认为还是处在你的方法错误》

suannai0314
suannai0314 您的这种回答更适合使用评论功能,以后您可以在问题下边进行添加评论
大约 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!