功能简述:
1.可以多用户登陆聊天室,用户可以选择私聊或者对所有人聊天。(这里时间关系仅实现群聊,私聊只要将私聊消息和群聊消息封装开来即可实现)
2.有人登陆聊天室时由系统通知所有在线用户,并刷新在线用户列表。
3.有人退出聊天室时由系统通知所有在线用户,并刷新在线用户列表。
登陆框:
聊天窗口
服务器控制台信息
服务器代码:
package exercise.chatroom;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
public class ChatServer {
List
clients = new
ArrayList();
Client c = null;
ArrayList
userList = new
ArrayList();
public static void main(String[] args){
new
ChatServer().start();
}
public void start(){
boolean started = false;
ServerSocket ss = null;
DataInputStream dis =
null;
try{
ss = new
ServerSocket(8888);
started =
true;
System.out.println("服务器上线了!");
}catch(Exception e) {
e.printStackTrace();
}
try{
while(started){
Socket s = ss.accept();
c = new Client(s);//启动线程,实行run()方法
System.out.println("有一客户端登陆了!");
new
Thread(c).start();//启动start方法,循环.start是Thread中的方法与这上面的start无关
clients.add(c);
//dis.close();
}
}catch(Exception e) {
//e.printStackTrace();
}
finally{
try {
ss.close();
} catch
(IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}
class Client implements Runnable {
private Socket s;
private DataInputStream dis
=null;
private DataOutputStream
dos=null;
private boolean bConnected
=false;
public Client(Socket s){
this.s=s;
try {
dis= new DataInputStream(s.getInputStream());
dos =new DataOutputStream(s.getOutputStream());
bConnected =true;
}catch
(IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
public void send(String
str)throws Exception{
dos.writeUTF(str);
}
public void run(){
try{
while(bConnected){
String
str = dis.readUTF();
if(str.charAt(0)
== 'L'){
userList.add("X"+str.substring(1));
String
str1 = "R" + "[系统消息]:" + str.substring(1) + "上线了!";
System.out.println(str1.substring(1));
for(int
i=0;i
c
= clients.get(i);
c.send(str1);
}
System.out.print("目前在线用户[
");
for(int
j=0;j
String
s = userList.get(j);
System.out.print(s.substring(1)+"
");
for(int
i=0;i
c
= clients.get(i);
c.send(s);
}
}
System.out.println("]");
}
else
if(str.charAt(0) == 'S'){
userList.remove("X"+str.substring(1));
String
str1 = "R" + "[系统消息]:" + str.substring(1) + "下线了!";
System.out.println(str1.substring(1));
for(int
i=0;i
c
= clients.get(i);
c.send(str1);
}
System.out.print("目前在线用户[
");
for(int
j=0;j
String
s = userList.get(j);
System.out.print(s.substring(1)+"
");
for(int
i=0;i
c
= clients.get(i);
c.send(s);
}