java网页聊天工具代码 java编写网络聊天程序( 四 )


copyright.setBounds(10,600,280,20);
c.add(currnum);
c.add(totalnum);
c.add(js);
c.add(chatmsg);
c.add(send);
c.add(copyright);
this.setVisible(true);
this.setResizable(false);
}
/**
*start()方法监听客户的连接
*并且保存客户端的相关信息EG:用户昵称、用户所使用的Socket
*用户连接到服务器成功之后 , 将其保存到用户列表中 , 并为该用户启动一个线程用于通信 */
@SuppressWarnings("deprecation")
public void start()
{
boolean isStarted = false;/*-- 用于标记服务器是否已经正常启动 --*/
try {
this.ss = new ServerSocket(port);
isStarted = true;
this.allmsg.append((new Date()).toLocaleString()+"服务器启动 @ 端口: "+port+"\n");
while(isStarted)
{
Socket client = this.ss.accept(); /*-- 监听客户端的连接 --*/
DataInputStream in = new DataInputStream(client.getInputStream());
String name = in.readUTF();
user u = new user();
u.name = name;
u.socket = client;
lists.add(u); //将该用户加到列表中去
num1++;
num2++;
currnum.setText(" 当前在线人数: "+num1);
totalnum.setText(" 上线总人数: "+num2);
this.allmsg.append((new Date()).toLocaleString()+" : "+u.name+" 登录 \n");
new Thread(new ClientThread(u)).start();/*-- 为该用户启动一个通信线程 --*/
}
} catch (IOException e) {
System.out.println("服务器已经启动......");
System.exit(0);
}
}
/**
* 通信线程主要功能包括:
* 1.监听客户端输入的信息
* 2.将接收到的信息转发给其他用户*/
class ClientThread implements Runnable
{
user user = null;
boolean isConnected = true;
DataInputStream dis = null;
DataOutputStream dos = null;
public ClientThread(user u)
{
this.user = u;
try {
this.dis = new DataInputStream(this.user.socket.getInputStream());
this.dos = new DataOutputStream(this.user.socket.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run()
{
readmsg();
}
/*-- 读取客户的聊天信息 --*/
@SuppressWarnings("deprecation")
public void readmsg()
{
while(isConnected)
{
try {
String msg = dis.readUTF();
if("quitlogout".equals(msg))//当用户关闭客户端窗口时 , 发送quit字符串 表示用户已经退出
{
num1--;
try{
this.dis.close();
this.dos.close();
this.user.socket.close();
this.isConnected = false;
}catch(IOException ioe)
{
ioe.printStackTrace();
}finally{
this.isConnected = false;
if(dis!=null) this.dis.close();
if(dos!=null) this.dos.close();
if(this.user.socket!=null) this.user.socket.close();
}
lists.remove(this.user);//从列表中删除该用户
currnum.setText(" 当前在线人数: "+num1);
allmsg.append((new Date()).toLocaleString()+": "+this.user.name+"退出\n");
}
else
sendmsg(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/*-- 将信息进行转发 --*/
public void sendmsg(String msg)
{
user us = new user();
DataOutputStream os = null;
if(lists.size()0)
{
for(int i=0;ilists.size();i++)
{
us = lists.get(i);
try {
os = new DataOutputStream(us.socket.getOutputStream());
os.writeUTF(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
else
JOptionPane.showMessageDialog(null, "当前无用户在线 。发送消息失败","失败",JOptionPane.OK_OPTION);

推荐阅读