用java写一个聊天室,当客服端输入start时,服务端每10秒自动给客服端回复一个信息。(我实现不了自动,大家帮帮忙)我个人估计是输出堵塞,只输出了第一次,后面被堵住了。 我调试的时候,如果我先结束客服端程序,服务端会出错,说明还在做输出动作。 但是我先关掉服务端就没事。谢各位大侠了。我现在目前想实现的功能就是输入start能不断地接受到服务器的回复。
服务端代码:
package qhliao;
import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.*;
import qhliao.test.Client;
public class Server {
    public static void main(String[] args) {
        List<serverHandle> clients = new ArrayList<serverHandle>();//服务端的总数
        try{
        ServerSocket ss=new ServerSocket(3300);
        System.out.println("等待连接........");
        Socket sk =ss.accept();
        serverHandle sh=new serverHandle(sk);
        Thread th1=new Thread(sh);////////
        th1.start();
        clients.add(sh);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }    }}
class serverHandle implements Runnable{
    Socket sk1;
    DataInputStream in;
    DataOutputStream out;
    public serverHandle(Socket sk)
    {
        this.sk1=sk;
        try{
            in= new DataInputStream(sk1.getInputStream());
            out=new DataOutputStream(sk1.getOutputStream());
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }    
    }
    public void  sendmessage()throws IOException{
        int i =0;
        while(true)
        {    
            String s="谢谢你";
            out.flush();
            out.writeUTF(s);
            out.flush();
            System.out.println(i);
            i=i+2;
            //Thread.sleep(1000);    
        }
        
    }
    public void run(){
        try{
            int i=0;
            String str =in.readUTF();
            System.out.println(str);
            out.flush();
            if(str.equals("start")){
                //while(true){
                //    i++;
                //    System.out.println(i);
                sendMessage sM=new sendMessage(sk1);
                Thread     th2=new Thread(sM);
                th2.start();
                    //sendmessage();
        //    out.println("你好吗");
            //out.flush();
                //}
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
    
    }
}
class sendMessage implements Runnable{
    Socket sk2;
    DataInputStream in;
    DataOutputStream out;
    String str0="信心";
     sendMessage(Socket sk)
     {
         this.sk2=sk;
         try{
                in= new DataInputStream(sk2.getInputStream());
                out=new DataOutputStream(sk2.getOutputStream());
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }    
     }
    public void sendMsg()//自动回复函数,这个函数会被多次循环
    {
        try{
            out.writeUTF(str0);//不实施多次回复
            out.flush();
                                                                System.out.println("1111");//实施多次输出
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    public void run(){
        while(true){
            try{
                
                Thread.sleep(1000);
                //out.writeUTF();
                sendMsg();//此处调用回复函数,但总是不能多次回复,只能回复一次!!!!!
            
            }
                catch(Exception e)
                {
                    e.printStackTrace();
                }
            
        }
    
    }
}
客服端代码:
package qhliao;
import java.net.*;
import java.io.*;
public class ExamClient {
    static Socket svr;
    public static void main(String[] args)throws Exception {
        System.out.println("正在连接服务器,请稍后......");
        svr=new Socket(InetAddress.getLocalHost(),3300);
        if(svr!=null)
        {
            System.out.println("与"+svr.getInetAddress()+"连接成功,请输入要传送的信息...");
            DataInputStream in=new DataInputStream(svr.getInputStream());
            DataOutputStream  out =new DataOutputStream (svr.getOutputStream());
            BufferedReader wt=new BufferedReader(new InputStreamReader(System.in));
            while(true)
            {
                String str=wt.readLine();
                out.writeUTF(str);//输出服务端发来的信息
                out.flush();
                
                if(str.equals("stop")){
                    System.out.println(in.readUTF());
                    in.close();
                    out.close();
                    System.out.println("已和服务器断开");
                    break;    
                }
                System.out.println(in.readUTF());
                
            }
            svr.close();
        }
        else{
            System.out.println("连接失败");
            svr.close();
        }
    }
}

解决方案 »

  1.   

    貌似不是简单的聊天室程序。
    线程的设计,逻辑不够清晰。
    没有相应的注释,观看代码比较麻烦。
    类名和方法名相同,容易混淆。问题应该出在客户端那里,控制台没有输入一行信息的时候,那个String str=wt.readLine();语句
    是会被阻塞的。楼主可以尝试敲些回车在客户端的控制台,这样程序就可以进行下去了。我的博客上面倒是有个简单的聊天室程序,楼主可以参考一下,简单得连客户端程序都不用,
    直接telnet上去就行。