package com.wenqier.chat.client;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.List;

import javax.swing.JOptionPane;

import com.wenqier.chat.util.CharacterUtil;
import com.wenqier.chat.util.XMLUtil;

public class ClientConnection extends Thread
{
	private String hostAddress;
	
	private int port;
	
	private String username;
	
	private Client client;
	
	private Socket socket;
	
	private InputStream is;
	
	private OutputStream os;
	
	private ChatClient chatClient;
	
	public ClientConnection(Client client, String hostAddress, int port, String username)
	{
		this.client = client;
		this.hostAddress = hostAddress;
		this.port = port;
		this.username = username;
		
		//连接服务器
		this.connect2Server();	
	}

	// 连接服务器,由构造方法调用
	private void connect2Server()
	{
		try
		{
			this.socket = new Socket(this.hostAddress, this.port);
			
			this.is = this.socket.getInputStream();
			this.os = this.socket.getOutputStream();
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
	
	// 用户登录,向服务器端传送用户名
	// 返回true表示登录成功
	// 返回false表示登录失败
	public boolean login()
	{
		try
		{
			String xml = XMLUtil.constructLoginXML(this.username);
			System.out.println(xml.toString());
			os.write(xml.getBytes()); // 向服务器端发送用户的登录信息(其中包含了用户名)
			
			byte[] buf = new byte[5000];
			int length = is.read(buf); // 读取服务器端的响应结果,判断用户是否登录成功
			
			String loginResultXML = new String(buf, 0, length);
			
			String loginResult = XMLUtil.extractLoginResult(loginResultXML);
			
			// 登录成功
			if("success".equals(loginResult))
			{
				//打开聊天室主窗口
				this.chatClient = new ChatClient(this);
				
				this.client.setVisible(false);
				
				return true;
			}
			// 登录失败
			else
			{
				return false;
			}
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
		
		return false;
	}
	
	public Socket getSocket()
	{
		return socket;
	}

	public void sendMessage(String message, String type)
	{
		try
		{
			int t = Integer.parseInt(type);
			
			String xml = null;
			
			//客户端向服务器端发送聊天数据
			if(CharacterUtil.CLIENT_MESSAGE == t)
			{
				xml = XMLUtil.constructMessageXML(this.username, message);
			}
			//客户端向服务器端发送关闭窗口的数据
			else if(CharacterUtil.CLOSE_CLIENT_WINDOW == t)
			{
				xml = XMLUtil.constructCloseClientWindowXML(this.username);
			}
			
			//向服务器端发送数据
			this.os.write(xml.getBytes());
			
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
	
	@Override
	public void run()
	{
		try
		{
			while(true)
			{
				byte[] buf = new byte[5000];
				int length = is.read(buf);
				
				String xml = new String(buf, 0, length);
				
				int type = Integer.parseInt(XMLUtil.extractType(xml));
				
				//在线用户列表
				if(type == CharacterUtil.USER_LIST)
				{
					List<String> list = XMLUtil.extractUserList(xml);
					
					String users = "";
					
					for(String user : list)
					{
						users += user + "\n";
					}
					
					this.chatClient.getJTextArea2().setText(users);
				}
				// 服务器端发来的聊天数据
				else if(type == CharacterUtil.SERVER_MESSAGE)
				{
					String content = XMLUtil.extractContent(xml);
					
					this.chatClient.getJTextArea1().append(content + "\n");
				}
				// 关闭服务器端窗口
				else if(type == CharacterUtil.CLOSE_SERVER_WINDOW)
				{
					JOptionPane.showMessageDialog(this.chatClient, "服务器端已关闭,程序将退出!", "信息", JOptionPane.INFORMATION_MESSAGE);
					
					System.exit(0); //客户端退出
				}
				// 服务器端确认关闭客户端窗口
				else if(type == CharacterUtil.CLOSE_CLIENT_WINDOW_CONFIRMATION)
				{
					try
					{
						this.getSocket().getInputStream().close();
						this.getSocket().getOutputStream().close();
						this.getSocket().close();
					}
					catch(Exception ex)
					{
						
					}
					finally
					{
						System.exit(0);//退出客户端程序
					}
				}
			}
		}
		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  LV6 4月15日
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日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友