package com.wenqier.chat.server;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JOptionPane;

import com.wenqier.chat.util.XMLUtil;

public class ServerConnection extends Thread
{
	private ServerSocket serverSocket;
	
	private Server server;
	
	public ServerConnection(Server server, int port)
	{
		try
		{
			this.server = server;
			
			this.serverSocket = new ServerSocket(port);
			
			// 下面两行代码不能放到上面一行代码之前
			// 因为服务器启动时有可能会抛出异常
			// 如果放在上面,则发生异常时也会导致label上的文本发生变化
			// 这与实际情况不符
			this.server.getJLabel2().setText("运行");
			this.server.getJButton().setEnabled(false);
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
			
			JOptionPane.showMessageDialog(this.server, "端口号被占用!", "警告", JOptionPane.ERROR_MESSAGE);
		}
	}

	@Override
	public void run()
	{
		while(true)
		{
			try
			{
				Socket socket = this.serverSocket.accept();
				
				InputStream is = socket.getInputStream();
				OutputStream os = socket.getOutputStream();
				
				byte[] buf = new byte[5000];
				int length = is.read(buf);
				
				//客户端发来的连接信息(包括了用户名)
				String loginXML = new String(buf, 0, length);
				
				// 从客户端登录数据中提取出用户名信息(username)
				String username = XMLUtil.extractUsername(loginXML); 
				
				String loginResult = null;
				
				// 判断用户是否登录成功
				boolean isLogin = false;
				
				// 判断用户名是否重复
				// 用户名重复
				if(this.server.getMap().containsKey(username))
				{
					loginResult = "failure";
				}
				// 用户名不重复
				else
				{
					loginResult = "success";
					
					isLogin = true;
				}
				
				String xml = XMLUtil.constructLoginResultXML(loginResult);
				
				os.write(xml.getBytes());
				
				// 如果用户登录成功,启动线程
				if(isLogin)
				{
					// 准备创建新的线程,用于处理用户的聊天数据,每一个连接上的用户都会对应一个该线程
					ServerMessageThread serverMessageThread = new ServerMessageThread(this.server, socket);
					//将用户名及与之对应的线程对象 放到Map中
					this.server.getMap().put(username, serverMessageThread);
					
					//更新用户列表(服务器端+客户端)
					serverMessageThread.updateUserList();
					
					serverMessageThread.start();
				}				
			}
			catch(Exception ex)
			{
				ex.printStackTrace();
			}
		}
	}
	
}
最近下载更多
13133117021  LV5 2024年12月26日
zeng1206  LV7 2023年12月28日
hentai233  LV1 2023年11月17日
vitcheu  LV1 2023年5月27日
Kevin_001  LV6 2022年7月3日
wxh1234567  LV4 2022年6月20日
106sadadwd  LV2 2022年6月18日
haneri  LV1 2022年6月5日
GaaraNi  LV1 2022年4月21日
炸蝎子奥特  LV1 2022年2月12日
最近浏览更多
13133117021  LV5 2024年12月26日
Reach_hehe  LV1 2024年12月6日
qwertasdfgkwuejwjwjw  LV1 2024年6月27日
ethan_ 2024年5月29日
暂无贡献等级
28128觅北  LV2 2024年5月22日
krispeng  LV14 2024年4月15日
woldxy  LV12 2024年4月1日
taoshen95  LV16 2024年1月18日
zeng1206  LV7 2023年12月28日
陈小灏  LV18 2023年12月27日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友