import java.awt.Color;
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

/**
 * 
 * @author tian QQ客户端
 */
public class Client extends Clientframe {
	Message receivemsg; // 在线用户之间的聊天信息
	Usermessage usermsg; // 用户信息
	Socket s;
	ObjectOutputStream oos;
	String ipaddress; // 服务器IP
	ArrayList al = new ArrayList();
	String cmd;
	boolean flag = false;

	/**
	 * 构造方法
	 */
	public Client() {
		usermsg = new Usermessage();
		
		try {
			usermsg.ip = InetAddress.getLocalHost().getHostAddress();
		} catch (UnknownHostException e3) {
			e3.printStackTrace();
		}
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		//上线时触发,发送用户信息(usermsg)给服务器
		jb1.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {

				String ipaddress = jtfname2.getText(); // 得到服务器IP
				
					try {
						if (flag == false) {
						s = new Socket(ipaddress, 9999);
						oos = new ObjectOutputStream(s.getOutputStream());
						flag = true;
						}
					} catch (UnknownHostException e2) {
						e2.printStackTrace();
					} catch (IOException e2) {
						e2.printStackTrace();
					}
					try {
						usermsg.username = jtfname.getText();
						usermsg.password = jtfpwd.getText();
						usermsg.flag1 = true; // 登陆是设为true
						oos.writeObject(usermsg);
						oos.reset();
					} catch (UnknownHostException e1) {
						e1.printStackTrace();
					} catch (IOException e1) {
						e1.printStackTrace();
					}
					ClientThread ct = new ClientThread();
					ct.start();
				}
		});

		
//		  监听用户下线信息
		jfb.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				Usermessage usermsg1 = new Usermessage();
				usermsg1.flag1 = false; // 表明用户下线
				usermsg1.username = usermsg.username;
				usermsg1.password = usermsg.password;
				try {
					usermsg1.ip = InetAddress.getLocalHost().getHostAddress();
				} catch (UnknownHostException e2) {
					e2.printStackTrace();
				}
				// 将用户信息发给服务器说明该客户要下线
				try {
					oos.writeObject(usermsg1);
					System.exit(0);
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		});

//		  监听双击在线用户列表事件
		
		jli.addMouseListener(new MouseListener() {
			public void mouseClicked(MouseEvent e) {
				if (e.getClickCount() == 2) {
					JList source = (JList) e.getSource();
					Object[] selection = source.getSelectedValues();
					cmd = (String) selection[0];
					String[] ss = cmd.split("\\s+");
					jfaa.setTitle("与" + ss[0] + "聊天");
					jfaa.setVisible(true);
				}

			}

			public void mouseEntered(MouseEvent e) {

			}

			public void mouseExited(MouseEvent e) {

			}

			public void mousePressed(MouseEvent e) {

			}

			public void mouseReleased(MouseEvent e) {

			}

		});

		//监听私聊send按钮
		jbaa.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				ClientUtil cu = new ClientUtil();
				Message m = new Message();
				m.fromname = usermsg.username;
				m.msg = jtabb.getText();
				String[] ss = cmd.split("\\s+");
				m.toname = ss[0];
				m.flag = true;
				try {
					oos.writeObject(m);
				} catch (IOException e1) {
					e1.printStackTrace();
				}
				jtabb.setText("");
//				 调用ClientUtil中的dealmessage()方法对信息进行处理
				ArrayList msglist = ClientUtil.dealmessage(m.msg);
				// 调用ClientUtil中的printmsg()将信息显示到面板上
				cu.printmsg(msglist, jtaaa,m);
			}

		});

		
		 // 监听群聊send按钮
		jba.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Message m = new Message();
				m.fromname = usermsg.username;
				m.msg = textPane1.getText();
				m.toname = "alluser";
				try {
					oos.writeObject(m);
				} catch (IOException e1) {
					// e1.printStackTrace();
				}
				textPane1.setText("");
			}

		});

		// 监听Transportfile按钮,实现文件传输,只能传输小文件
		jbbc.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				FileDialog f = new FileDialog(jfaa, "文件传送", FileDialog.LOAD);
				f.setVisible(true);
				String filename = f.getDirectory() + f.getFile();
				File file = new File(filename);
				FileInputStream fis;
				try {
					fis = new FileInputStream(file);
					int len = (int) file.length();
					byte[] data = new byte[len];
					fis.read(data);
					Message m = new Message();
					m.data = new byte[len]; 
					m.fromname = usermsg.username;
					String[] ss = cmd.split("\\s+");
					m.toname = ss[0];
					m.flag = false;
					
					for (int i = 0; i < data.length; i++) {
						m.data[i] = data[i];
					}
					oos.writeObject(m);
				} catch (FileNotFoundException e1) {
					e1.printStackTrace();
				} catch (IOException e2) {
					e2.printStackTrace();
				}

			}

		});

		// 监听"群聊"按钮
		jb.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				jfa.setVisible(true);
			}

		});
	}

	
	 //显示在线用户列表(由服务器传入)
	
	class ClientThread extends Thread {
		ObjectInputStream ois;

		public void run() {
			ClientUtil cu = new ClientUtil();
			try {
				ois = new ObjectInputStream(s.getInputStream());
				while (true) {
					Object[] o = (Object[]) ois.readObject();

					// 处理“用户名重名”信息
					if (o[0] instanceof String) {
						String s1 = (String) o[0];
						if (s1.equals("用户名重复请重新填写")) {
							jtfname3.setText(s1);
						} else {
							jfb.setTitle(jtfname.getText());
							jfb.setVisible(true);
							jf.setVisible(false);
						}
					}

					// 处理用户信息
					if (o[0] instanceof Usermessage) {
						Usermessage u = (Usermessage) o[0];
						// 处理用户上线信息
						if (u.flag1) {
							dlm.clear();
							for (int i = 0; i < o.length; i++) {
								dlm.addElement(o[i].toString());
							}
						} else {
							// 处理用户下线信息
							for (int i = 0; i < dlm.size(); i++) {
								String s = dlm.get(i).toString();
								String[] ss = s.split("\\s+");
								if (ss[0].equals(u.username)) {
									dlm.remove(i);
									break;
								}
							}
						}
					}

					// 处理聊天信息
					if (o[0] instanceof Message) {
						Message u = (Message) o[0];
						// 处理群聊信息
						if (u.toname.equals("alluser")) {
							// 调用ClientUtil中的dealmessage()方法对信息进行处理
							ArrayList msglist = ClientUtil.dealmessage(u.msg);
							// 调用ClientUtil中的printmsg()将信息显示到面板上
							cu.printmsg(msglist, textPane,u);
						}
						// 处理私聊信息
						if (u.toname.equals(usermsg.username)) {
							if (u.flag) {
								jfaa.setVisible(true);
								jfaa.setTitle("与" + u.fromname + "聊天");
//								 调用ClientUtil中的dealmessage()方法对信息进行处理
								ArrayList msglist = ClientUtil.dealmessage(u.msg);
								// 调用ClientUtil中的printmsg()将信息显示到面板上
								cu.printmsg(msglist, jtaaa,u);
								cmd = u.fromname;
							} else {
//								处理接收文件
								FileDialog f = new FileDialog(jfaa,
										"文件接收", FileDialog.SAVE);
								f.setVisible(true);
								String filename = f.getDirectory()
										+ f.getFile();
								FileOutputStream fos = new FileOutputStream(
										filename);
								byte[] buf = u.data;
								fos.write(buf);
								fos.close();
							}
						}
					}
				}
			} catch (IOException e) {
				 e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		Client c = new Client();
	}
}
最近下载更多
cksndh  LV4 2023年8月16日
fuyouou  LV5 2023年6月29日
yuanchuang  LV22 2023年2月14日
liys1234  LV9 2022年6月21日
微信网友_6003487859068928  LV5 2022年6月15日
微信网友_5989987974549504  LV5 2022年6月5日
17岁的孩子想糖吃  LV7 2021年12月31日
111111255  LV2 2021年12月24日
Aoifee  LV4 2021年11月10日
最近浏览更多
goccgoccgocc  LV4 5月9日
krispeng  LV13 4月15日
陈小灏  LV15 2023年12月26日
luamweise 2023年10月18日
暂无贡献等级
wertttak  LV1 2023年9月26日
小新Coding  LV9 2023年9月7日
cksndh  LV4 2023年8月16日
fuyouou  LV5 2023年6月29日
2017143155  LV12 2023年6月24日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友