java简单的聊天室

lxy7777777 2009-07-25 11:40:23
用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();
}
}
}
...全文
232 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly2808 2009-08-05
  • 打赏
  • 举报
回复
不好意思 小弟说话有点过了 不要介意
fly2808 2009-08-05
  • 打赏
  • 举报
回复
大哥 您平时都这么写代码的吗
我一点也不想看 不知道你这些都是干什么的
不是看不懂
一点注释没有
我通览了 一遍 一个都没有
最起码 变量是什么 注释一下
方法干什么 注释一下
这是最起码的
qq88688868 2009-08-04
  • 打赏
  • 举报
回复
涨知识了
chenxiancool 2009-07-26
  • 打赏
  • 举报
回复
学习了
「已注销」 2009-07-26
  • 打赏
  • 举报
回复
这个的话我写过一个
手上有源码,你要的话联系我邮箱,我会个附件给你
冰思雨 2009-07-26
  • 打赏
  • 举报
回复
貌似不是简单的聊天室程序。
线程的设计,逻辑不够清晰。
没有相应的注释,观看代码比较麻烦。
类名和方法名相同,容易混淆。

问题应该出在客户端那里,控制台没有输入一行信息的时候,那个String str=wt.readLine();语句
是会被阻塞的。楼主可以尝试敲些回车在客户端的控制台,这样程序就可以进行下去了。

我的博客上面倒是有个简单的聊天室程序,楼主可以参考一下,简单得连客户端程序都不用,
直接telnet上去就行。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧