📄 talkserver.java
字号:
package server;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class TalkServer extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private ServerSocket server = null;
private ArrayList<UserMessage> users = new ArrayList<UserMessage>();
private JLabel b = new JLabel("简单聊天室服务器端");
private TextArea show = new TextArea("");
private JPanel p = new JPanel();
private JButton fresh = new JButton("刷新服务器记录");
private JButton remove = new JButton("踢人");
public static void main(String[] args) {
new TalkServer();
}
//服务器端初始化,包括:界面显示,调用userLogOn方法。
public TalkServer() {
this.setSize(400, 300);
this.setLocation(400, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new BorderLayout());
p.setLayout(new GridLayout(1, 2));
p.add(fresh);
p.add(remove);
this.add(b, BorderLayout.NORTH);
this.add(show, BorderLayout.CENTER);
this.add(p, BorderLayout.SOUTH);
show.setEditable(false);
this.setVisible(true);
fresh.addActionListener(this);
remove.addActionListener(this);
userLogOn();
}
//用来接收客户端连接,验证用户名是否重复并存储客户端信息,
public void userLogOn() {
try {
server = new ServerSocket(8888);
while (true) {
try {
Socket serverSocket = server.accept();
InputStream input = serverSocket.getInputStream();
DataInputStream dataInput = new DataInputStream(input);
String name = dataInput.readUTF();
OutputStream output = serverSocket.getOutputStream();
DataOutputStream dataOutput = new DataOutputStream(output);
if (users.size() == 0) {
dataOutput.writeUTF("yes");
show.append('\n' + name + "上线.");
TalkServerGet talkServerGet = new TalkServerGet(this,
serverSocket, name);
new Thread(talkServerGet).start();
UserMessage userMessage = new UserMessage();
userMessage.setClient(serverSocket);
userMessage.setName(name);
userMessage.setTalkServerGet(talkServerGet);
users.add(userMessage);
continue;
}
for (int i = 0; i < users.size(); i++) {
UserMessage userMessage = users.get(i);
if (userMessage.getName().equals(name)) {
dataOutput.writeUTF("no");
break;
}
if (i == users.size() - 1) {
dataOutput.writeUTF("yes");
show.append('\n' + name + "上线.");
TalkServerGet talkServerGet = new TalkServerGet(
this, serverSocket, name);
new Thread(talkServerGet).start();
UserMessage message = new UserMessage();
message.setClient(serverSocket);
message.setName(name);
message.setTalkServerGet(talkServerGet);
users.add(message);
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
//管理员有权踢出一个用户
public boolean removeUser(String name) {
UserMessage userMessage;
int i = 0;
for (; i < users.size(); i++) {
userMessage = users.get(i);
String nameStr = userMessage.getName();
if (nameStr.equals(name.trim())) {
Socket socket = userMessage.getClient();
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
users.remove(i);
return true;
}
}
return false;
}
public TextArea getShow() {
return show;
}
public void setShow(TextArea show) {
this.show = show;
}
//用于将用户发言转发到所用用户客户端
public void sendTalk(String str) {
Iterator<UserMessage> iter = users.iterator();
while (iter.hasNext()) {
UserMessage userMessage = iter.next();
try {
OutputStream output = userMessage.getClient().getOutputStream();
DataOutputStream dataOutput = new DataOutputStream(output);
dataOutput.writeUTF(str);
} catch (IOException e) {
e.printStackTrace();
}
}
}
//控件的事件监听器
public void actionPerformed(ActionEvent e) {
if (e.getSource() == fresh) {
show.setText("共有" + users.size() + "人在线.");
for (int i = 0; i < users.size(); i++) {
show.append('\n' + users.get(i).getName());
}
} else if (e.getSource() == remove) {
String name = JOptionPane.showInputDialog(this, "输入用户名");
if(this.removeUser(name)){
this.sendTalk(name + " 被管理员踢出聊天室。");
show.append('\n'+"成功踢出:" + name);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -