群聊天室是客户端连接服务器端之后,客户端向服务器端发送消息,然后服务器端接收到该客户端的消息之后,转发给其他的所有客户端的功能小程序。客户端需要输入自己的昵称,然后在群里发言,大家都能看见。
一、服务器端
1、先构建服务器端,开启服务器之后,客户端才能够进行连接
public class Server {
//用客户端的昵称作为key
Map<String,PrintWriter> allout;
//添加start方法
public void start() {
allout=new HashMap<String, PrintWriter>();
try {
//在Start方法中用ServerSocket创建服务器
ServerSocket server=new ServerSocket(8888);
System.out.println("服务器已经成功创建,等待客户端连接");
while(true) {
//用accept()方法等待客户端连接
Socket client=server.accept();
System.out.println("有客户接入,IP地址为:"+client.getInetAddress());
//启动线程
new ClientThread(client, allout).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
//创建Server对象,并调用start方法
Server server=new Server();
server.start();
}
}
2、建立接受客户端的消息和向客户端转发消息的线程
//向客户端发送消息,接受客户端发的消息
class ClientThread extends Thread{
//连接到服务器端的客户端
Socket client;
Map<String,PrintWriter> allout;
//建立有参构造器
public ClientThread(Socket client, Map<String, PrintWriter> allout) {
super();
this.client = client;
this.allout = allout;
}
public void run() {
//获取输入流对象
try {
OutputStream out=client.getOutputStream();
//使用自动刷新的输出流
PrintWriter pw=new PrintWriter(out);
pw.println("欢迎来到新明天补习班");
pw.println("请先输入学生姓名:");
//强制刷新
pw.flush();
//接受客户端的 消息
InputStream in=client.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(in));
//获取名字
String name=br.readLine();
//将名字和消息放入map集合
allout.put(name, pw);
String line=null;
while((line=br.readLine())!=null) {
//把信息发给当前除了自己的所有人
sendMsg(name+"说"+line,pw);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private void sendMsg(String line, PrintWriter pw) {
Set<String> names=allout.keySet();
//遍历
for(String name:names) {
PrintWriter p=allout.get(name);
if(p!=pw) {
p.println(line);
p.flush();
}
}
}
}
二、客户端
1、先建立客户端
public class Client {
//添加Open方法
public void open() {
try {
Socket client=new Socket("localhost",8888);
System.out.println("已成功连接服务器");
//获取客户端输入流对象
InputStream in=client.getInputStream();
new ReadFromServer(in).start();;
//获取客户端输出流对象
OutputStream out=client.getOutputStream();
new WriteToServer(out).start();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//建立Client对象,调用open()方法
Client client=new Client();
client.open();
}
}
2、建立读取服务器所发送消息的线程
//读取服务器发送消息的线程
class ReadFromServer extends Thread{
InputStream in;
public ReadFromServer(InputStream in) {
super();
this.in = in;
}
public void run() {
//缓冲字符输入流传入信息
BufferedReader br=new BufferedReader(new InputStreamReader(in));
String line=null;
try {
while((line=br.readLine())!=null) {
System.out.println(line);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、建立客户端向服务器发送消息的线程
//客户端向服务器发送消息的线程
class WriteToServer extends Thread{
OutputStream out;
public WriteToServer(OutputStream out) {
super();
this.out = out;
}
public void run() {
Scanner key=new Scanner(System.in);
PrintWriter p=new PrintWriter(out);
while(true) {
String line=key.nextLine();
p.println(line);
p.flush();
}
}
}