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

问题描述

刚开始学习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();
        }
    }

}

}

解决方案

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

解决方案二:

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

解决方案三:

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

解决方案四:

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

时间: 2024-08-24 15:41:35

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

初学java,自己用java写了一个简单的注册登录程序,没报错但有问题,希望能帮忙指点。

问题描述 初学java,自己用java写了一个简单的注册登录程序,没报错但有问题,希望能帮忙指点. import java.util.Scanner; class Yanzheng{ private String n; private String p; public void setNa(String na){ this.n = na; } public void setPa(String pa){ this.p = pa; } public String getNa(){ return n;

我的代码虽然写得很业余,但是没报错的情况下为什么连printf都执行不了。

问题描述 我的代码虽然写得很业余,但是没报错的情况下为什么连printf都执行不了. 要求从一个字符串里搜寻另一个字符出现的次数.下面是小白的代码. #include int main(int argc, const char * argv[]) { char hah[120],haha[120]; int i,j,num=0; printf("sting1 is "); gets(hah); printf("%sn",hah); printf("stri

刚开始学java,试了几个小程序总提示出错,java有毛病吗

问题描述 我再论坛上找了几个小程序复制好了,javac通过了,一执行就提示出错怎么回事啊?提示:Exceptioninthread"main"java.lang.UnsupportedClassUersionError:hello<Unsupportedmajor.minorversion50.0>atjava.lang.ClassLoader.defineClass0<NativeMethod>atjava.lang.ClassLoader.defineCla

刚开始学习java 多线程遇到的问题

问题描述 刚开始学习java 多线程遇到的问题 今天刚看的多线程教程 结合网上的实例,自己改的简单代码 结果运行一晃眼 jvm就停了如图: 控制台: 求友人明示 解决方案 你这是if,当然执行完一次,run就结束了,线程也结束了if(tickets>0)改成while(tickets>0){//你的内容}

大家好,我刚开始学习java,为什么用scanner输入中文代码错误。

问题描述 大家好,我刚开始学习java,为什么用scanner输入中文代码错误. 大家好,我刚开始学习java,为什么用scanner输入中文代码错误.输入英文没有错误 解决方案 控制台输入会有个字符集编码,所以输出你的输入的时候需要进行对象编码 解决方案二: 好像可以设置字符集 你百度下 解决方案三: 设置字符集为UTF-8 解决方案四: windows->preferences-->general-->Context Text 把下属的 都设置为UTF-8 解决方案五: window

刚学的java,写了个压缩文件的小程序,一直没有成功

问题描述 刚学的java,写了个压缩文件的小程序,一直没有成功 public class f2Test { public static void main(String[] args){ frame02 f2=new frame02(); } } import java.awt.BorderLayout; import java.awt.Color; import java.awt.Image; import java.awt.Menu; import java.awt.MenuBar; imp

利用java socket 写的一个联机的五子棋游戏,服务器端和客户端的问题,大神求教啊。。

问题描述 利用java socket 写的一个联机的五子棋游戏,服务器端和客户端的问题,大神求教啊.. 利用java socket 写的一个联机的五子棋游戏,一个服务器端的程序和两个玩家的客户端程序,可不可以都运行在同一台主机上啊? 我运行服务器端和其中一个玩家的客户端程序时,正常.但是运行第二个玩家的客户端程序时,就出现了 Java.net.BindExecption Address already in use: JVM_Blind. 的异常.怎么办? 还有我打算客户端把下的棋子的对象传给服

java-新人学习JAVA,关于继承的一个问题

问题描述 新人学习JAVA,关于继承的一个问题 老师布置了一个作业,具体要求如下: 先创建一个flight对象(这个对象只有一个属性,就是航班号) 然后根据用户的输入, 判断这个flight对象 是pflight(个人航班,有两个属性,分别是航班号和个人的名字,航班号继承之前创建flight对象的属性,需要用户个人的名字) 还是gflight(群体航班,分别是航班号和群里数量,航班号继承之前创建flight对象的属性,需要用户输入补充群体的数量), 请问该如何实现?(需要在一个单独的CLASS里

java 方法 转化-在学习java时遇到这样一个问题,希望可以解答一下

问题描述 在学习java时遇到这样一个问题,希望可以解答一下 自定义了一个方法 card(int rank,int suit) 建立一个card的数组,排序之后,想输出一个,但是用Arrays.toString(int[])转换时,却不成功,有没有什么办法解决一下.