用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();
}
}
}
服务端代码:
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();
}
}
}
解决方案 »
- socket发送邮件
- 关于socket传输图片中的异常求解
- 请教。..
- 为什么用了validate()还是不能更新画面?小弟做毕业设计急着用......
- 一个运行java的问题
- 问一个原始问题: 我装好j2se后 ,classpth, path 都设好了但还是出错为什么?
- 怎样把Word 文件转化为.Hlp文件 (在线等候)谢谢
- 朋友们!当你的数据库中有100万条记录时,你的存取速度是不是很慢!我有解决方法!
- JAVA与VC相比,那个好?
- 关于java的构造函数的一个问题
- eclipse下package里的红X
- [分享]JAVA变量path , classpth ,java_home设置方法和作用
线程的设计,逻辑不够清晰。
没有相应的注释,观看代码比较麻烦。
类名和方法名相同,容易混淆。问题应该出在客户端那里,控制台没有输入一行信息的时候,那个String str=wt.readLine();语句
是会被阻塞的。楼主可以尝试敲些回车在客户端的控制台,这样程序就可以进行下去了。我的博客上面倒是有个简单的聊天室程序,楼主可以参考一下,简单得连客户端程序都不用,
直接telnet上去就行。