⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 talkserver.java

📁 类似于QQ的聊天程序
💻 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 + -