1 Star 17 Fork 0

QB61113/Socket聊天室

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
server.java 5.31 KB
一键复制 编辑 原始数据 按行查看 历史
xleixz 提交于 2022-04-09 22:39 . 2022年4月9日22:39:29
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
class server extends JFrame implements Runnable, ListSelectionListener, ActionListener {
private Socket s = null;
private ServerSocket ss = null;
private ArrayList<ChatThread> users = new ArrayList<ChatThread>(); //容量能够动态增长的数组
DefaultListModel<String> dl = new DefaultListModel<String>();
private JList<String> userList = new JList<String>(dl);//显示对象列表并且允许用户选择一个或多个项的组件。单独的模型 ListModel 维护列表的内容。
private JPanel jpl = new JPanel();
private JButton jbt = new JButton("踢出聊天室");
private JButton jbt1 = new JButton("群发消息");
//群发消息输入栏
private JTextField jtf = new JTextField();
public server() throws Exception {
this.setTitle("服务器端");
this.add(userList, "North");//放在北面
this.add(jpl, "South");
//仅将群发消息输入栏设为一栏
jtf.setColumns(1);
jpl.setLayout(new BorderLayout());
jpl.add(jtf, BorderLayout.NORTH);
jpl.add(jbt, BorderLayout.EAST);//踢出聊天室
jpl.add(jbt1, BorderLayout.WEST);//群发消息
//实现群发
jbt1.addActionListener(this);
//实现踢人
jbt.addActionListener(this);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLocation(400, 100);
this.setSize(500, 400);
this.setVisible(true);
this.setAlwaysOnTop(true);
ss = new ServerSocket(9999);
new Thread(this).start();//监听用户端的加入
}
@Override
public void run() {
while (true) {
try {
s = ss.accept();
ChatThread ct = new ChatThread(s); //为该客户开一个线程
users.add(ct); //将每个线程加入到users
//发送Jlist里的用户登陆信息,为了防止后面登陆的用户无法更新有前面用户的好友列表
ListModel<String> model = userList.getModel();//获取Jlist的数据内容
for (int i = 0; i < model.getSize(); i++) {
ct.ps.println("USERS#" + model.getElementAt(i));
}
ct.start();
} catch (Exception ex) {
ex.printStackTrace();
javax.swing.JOptionPane.showMessageDialog(this, "服务器异常!");
System.exit(0);
}
}
}
//群发消息按钮点击事件监听
@Override
public void actionPerformed(ActionEvent e) {
String label = e.getActionCommand();
if (label.equals("群发消息")) {
handleAll();
} else if (label.equals("踢出聊天室")) {
try {
handleExpel();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
public void handleAll() {
if (!jtf.getText().equals("")) {
sendMessage("ALL#" + jtf.getText());
//发送完后,是输入框中内容为空
jtf.setText("");
}
}//群发消息
public void handleExpel() throws IOException {
sendMessage("OFFLINE#" + userList.getSelectedValuesList().get(0));
dl.removeElement(userList.getSelectedValuesList().get(0));//更新defaultModel
userList.repaint();//更新Jlist
}//踢人
public class ChatThread extends Thread {
Socket s = null;
private BufferedReader br = null;
private PrintStream ps = null;
public boolean canRun = true;
String nickName = null;
public ChatThread(Socket s) throws Exception {
this.s = s;
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
ps = new PrintStream(s.getOutputStream());
}
public void run() {
while (canRun) {
try {
String msg = br.readLine();//接收客户端发来的消息
String[] strs = msg.split("#");
if (strs[0].equals("LOGIN")) {//收到来自客户端的上线消息
nickName = strs[1];
dl.addElement(nickName);
userList.repaint();
sendMessage(msg);
} else if (strs[0].equals("MSG") || strs[0].equals("SMSG") || strs[0].equals("FSMSG")) {
sendMessage(msg);
} else if (strs[0].equals("OFFLINE")) {//收到来自客户端的下线消息
sendMessage(msg);
//System.out.println(msg);
dl.removeElement(strs[1]);
// 更新List列表
userList.repaint();
}
} catch (Exception ex) {
}
}
}
}
public void sendMessage(String msg) { //服务器端发送给所有用户
for (ChatThread ct : users) {
ct.ps.println(msg);
}
}
@Override
public void valueChanged(ListSelectionEvent e) {
// TODO 自动生成的方法存根
}
public static void main(String[] args) throws Exception {
new server();
}
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Java
1
https://gitee.com/qb61113/socket-chat-room.git
git@gitee.com:qb61113/socket-chat-room.git
qb61113
socket-chat-room
Socket聊天室
master

搜索帮助

0d507c66 1850385 C8b1a773 1850385