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

📄 chatserver.java

📁 1、 聊天室的实现
💻 JAVA
字号:
import java.awt.Font;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.Rectangle;
import java.awt.TextArea;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;

import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Enumeration;
import java.util.Hashtable;

import javax.swing.JOptionPane;
import javax.swing.UIManager;

/*  
 * 
 * 
 */
public class ChatServer extends Frame
{
	final static int PORT = 1234; // Server Socket的监听端口

	// TODO
	// static int userCount = 0;

	private Panel panel = null;

	private static Label label = null;

	static TextArea msgArea = null;

	/**
	 * This method initializes panel
	 * 
	 * @return java.awt.Panel
	 */
	private Panel getPanel()
	{
		if (panel == null)
		{
			label = new Label();
			label.setBounds(new Rectangle(100, 4, 250, 24));
			label.setFont(new Font("Dialog", Font.PLAIN, 16));
			label.setText("服务器监视器");
			panel = new Panel();
			panel.setLayout(null);
			panel.setBounds(new Rectangle(4, 32, 408, 213));
			panel.add(label, null);
			panel.add(getTextArea(), null);
		}
		return panel;
	}

	/**
	 * This method initializes textArea
	 * 
	 * @return java.awt.TextArea
	 */
	private TextArea getTextArea()
	{
		if (msgArea == null)
		{
			msgArea = new TextArea();
			msgArea.setBounds(new Rectangle(8, 28, 391, 172));
			msgArea.setEditable(false);
		}
		return msgArea;
	}

	public ChatServer()
	{
		super();
		this.setLayout(null);
		this.setSize(418, 251);
		this.setTitle("聊天室服务器监视器");
		this.setVisible(true);
		this.add(getPanel(), null);
		this.setResizable(false);
		this.addWindowListener(new java.awt.event.WindowAdapter()
		{
			public void windowClosing(java.awt.event.WindowEvent e)
			{
				System.exit(0);
			}
		});
	}

	public static void main(String args[])
	{
		ServerSocket server = null;
		Socket user = null; // 对于一个用户会启动一个服务线程
		Hashtable userList = new Hashtable(); // 保存用户列表

		try
		{
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		ChatServer myserver = new ChatServer(); // 实例化一个chatServer类
		msgArea.append("Server starting ...\n");

		try
		{
			server = new ServerSocket(PORT);// 设置监听端口
			if (server != null)
			{
				msgArea
						.append("The server is listening on port " + PORT
								+ "\n");

			}
		} catch (IOException e)
		{
			// TODO 自动生成 catch 块
			// e.printStackTrace();
			JOptionPane.showMessageDialog(null, "Socket连接失败", "服务器运行错误",
					JOptionPane.ERROR_MESSAGE);
			System.exit(0);
		}
		while (true)
		{

			try
			{
				user = server.accept();// 服务器接到一个用户的socket请求
			} catch (IOException e)
			{
				// TODO 自动生成 catch 块
				e.printStackTrace();
			}
			if (user != null)
			{
				InetAddress address = user.getInetAddress(); // 获取用户的IP地址

				// 启动一个服务线程为该用户服务
				ServerThreadForUser userThread = new ServerThreadForUser(user,
						userList, address, msgArea);
				userThread.start();

			} else
			// 异常情况
			{
				msgArea.append("Error in accept user!\n");
				continue;
			}

		}
	}
}

/*
 * 该线程接收用户端socket的信息并反馈
 * 
 */
class ServerThreadForUser extends Thread
{
	String name = null, nickName = null;

	Socket socket = null;

	File file = null;

	DataOutputStream out = null;

	DataInputStream in = null;

	Hashtable userList = null;

	TextArea msgArea = null;

	InetAddress address = null;

	ServerThreadForUser(Socket userSocket, Hashtable list, InetAddress address,
			TextArea msgArea)
	{
		userList = list;
		socket = userSocket;
		this.address = address;
		this.msgArea = msgArea;

		try
		{
			in = new DataInputStream(socket.getInputStream());// 用户socket写入
			out = new DataOutputStream(socket.getOutputStream()); // 
		} catch (IOException e)
		{
			// TODO 自动生成 catch 块
			e.printStackTrace();
		}
	}

	public void run()
	{

		while (true)
		{
			String info = null;
			try
			{
				info = in.readUTF();
				if (info.startsWith("姓名:"))
				{
					name = info.substring(info.indexOf(":") + 1, info
							.indexOf("昵称"));
					nickName = info.substring(info.lastIndexOf(":") + 1);

					if (userList.containsKey(name) == false) // 用户名不可重名
					{
						msgArea.append("用户:" + name + " 进入聊天室(IP:" + address
								+ ")\n");

						userList.put(name, this); // 可以聊天,加入user list
						out.writeUTF("可以聊天:");
						Enumeration userEnum = userList.elements();
						while (userEnum.hasMoreElements())
						{
							ServerThreadForUser userThread = (ServerThreadForUser) userEnum
									.nextElement();
							userThread.out.writeUTF("聊天者:" + name + "昵称:"
									+ nickName);

							if (userThread != this) // 非本用户
							{
								out.writeUTF("聊天者:" + userThread.name + "昵称:"
										+ userThread.nickName);
							}
						}

					} else
					// 已经有这个用户?
					{
						out.writeUTF("不可以聊天:");
					}
				} else if (info.startsWith("公共聊天内容:"))
				{
					String pubMsg = info.substring(info.indexOf(":") + 1);
					Enumeration userEnum = userList.elements();
					while (userEnum.hasMoreElements())
					{
						((ServerThreadForUser) userEnum.nextElement()).out
								.writeUTF("聊天内容:" + pubMsg);
					}
				} else if (info.startsWith("用户离开:"))
				{
					Enumeration userEnum = userList.elements();
					while (userEnum.hasMoreElements())
					{
						try
						{
							ServerThreadForUser userThread = (ServerThreadForUser) userEnum
									.nextElement();
							if (userThread != this && userThread.isAlive())
							{
								userThread.out.writeUTF("用户离线:" + name);
							}
						} catch (IOException e)
						{
						}
					}
					userList.remove(name); // 清除该用户在user list中的相应项
					socket.close();
					msgArea.append("用户:" + name + " 离开了\n");
					break;
				}
			} catch (IOException e)
			{ // 对于异常的处理,用户离线
				Enumeration userEnum = userList.elements();
				while (userEnum.hasMoreElements())
				{
					ServerThreadForUser userThread = (ServerThreadForUser) userEnum
							.nextElement();
					if (userThread != this && userThread.isAlive())
					{
						try
						{
							userThread.out.writeUTF("用户离线:" + name);
						} catch (IOException e1)
						{
							// TODO 自动生成 catch 块
							e1.printStackTrace();
						}
					}

				}
				if (name != null)
					userList.remove(name);
				try
				{
					socket.close();
					in.close();
					out.close();
				} catch (IOException e1)
				{
					// TODO 自动生成 catch 块
					e1.printStackTrace();
				}
				msgArea.append("用户:" + name + " 离开了\n");
				break;
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -