📄 chatroomserver.java
字号:
package ChatRoom;
import java.awt.BorderLayout;
import java.awt.Font;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.HashSet;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class ChatRoomServer extends Thread{
private ServerSocket ss;
private HashSet<Socket> allSockets;
private JFrame frame;
private JTextArea area;
public ChatRoomServer(int port) throws IOException{
super();
ss=new ServerSocket(port);
allSockets=new HashSet<Socket>();
frame=new JFrame("聊天室服务器 口:"+port);
area=new JTextArea(new Date().toLocaleString()+" 服务器已启动!\n");
init();
}
public ChatRoomServer() {
frame=new JFrame();
area=new JTextArea(new Date().toLocaleString()+" 服务器已启动!\n");
String port;
do {
port = JOptionPane.showInputDialog(frame, "请输入端口号:");
if(port==null)
System.exit(0);
try {
ss = new ServerSocket(Integer.parseInt(port));
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(frame, "端口号错误!");
} catch (IOException e) {
JOptionPane.showMessageDialog(frame, "端口号已被占用,请重新输入!");
}
} while (ss==null);
frame.setTitle("聊天室服务器 端口:"+port);
allSockets=new HashSet<Socket>();
init();
}
private void init(){
area.setFont(new Font("",Font.BOLD,24));
JScrollPane jsp=new JScrollPane(area);
frame.add(jsp,BorderLayout.CENTER);
}
private void showMe(){
frame.setLocation(400,300);
frame.setSize(800, 600);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void run(){
showMe();
while(true){
Socket s;
try {
s = ss.accept();
allSockets.add(s);
new ChatRoomServerThread(s,allSockets).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ChatRoomServerThread extends Thread{
private HashSet<Socket> allSockets;
private Socket s;
private BufferedReader br;
private InputStreamReader isr;
private PrintWriter pw;
public ChatRoomServerThread(Socket s,HashSet<Socket> allSockets) {
this.s=s;
this.allSockets=allSockets;
}
public void run(){
//得到s的输入流,并包装成BufferedReader
//循环不停的从BufferedReader中读取数据。
//每读到一行数据就将这一行数据转发给所有在线的客户端。
// 循环遍历allSockets,得到每一个socket,
// 然后得到该socket的输出流,并包装,再向输出流中写数据。
try {
isr = new InputStreamReader(s.getInputStream());
br = new BufferedReader(isr);
area.append(new Date().toLocaleString()+" "+s.getInetAddress()+"/ "+br.readLine()+":进入聊天室!\n");
} catch (Exception e) {
}
while(true){
try {
String str=br.readLine();
while(str.split(":")[1].equals("%GOODBYE%")){
area.append(new Date().toLocaleString()+" "+s.getInetAddress()+"/ "+str.split(":")[0]+":退出聊天室!\n");
br.close();
isr.close();
allSockets.remove(s);
return;
}
sendMessageToAllClients(str);
} catch (IOException e) {
e.printStackTrace();
}
}
}//run end!
public void sendMessageToAllClients(String str) throws IOException{
Date date=new Date();
for(Socket temp:allSockets){
pw=new PrintWriter(temp.getOutputStream(),true);
pw.println(date.toLocaleString()+" "+str);
}
}
}
public static void main(String[] args){
new ChatRoomServer().start();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -