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();
			}
		}
	}
	
}
最近下载更多
zeng1206  LV5 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日
shan454  LV3 2022年1月24日
最近浏览更多
krispeng  LV5 昨天
woldxy  LV12 4月1日
taoshen95  LV14 1月18日
zeng1206  LV5 2023年12月28日
陈小灏  LV14 2023年12月27日
qazqaz54188 2023年12月10日
暂无贡献等级
hentai233  LV1 2023年11月17日
13161895  LV1 2023年7月4日
fuyouou  LV5 2023年6月29日
2017143155  LV12 2023年6月24日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友