Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

JAVA进阶案例 TCP编程之网络聊天工具(客户端)

$
0
0

首先附上登录操作


登录界面就不说了,直说业务处理。当点击登录之后

/*
		 * 如果点击了登录按钮 首先判断帐号或者密码是否为空 然后封装为CommandTranser对象 向服务器发送数据 服务器通过与数据库的比对
		 * 来验证帐号密码
		 */
		if (e.getSource() == login) {
			String username = text_name.getText().trim();
			String password = new String(text_pwd.getPassword()).trim();
			if ("".equals(username) || username == null) {
				JOptionPane.showMessageDialog(null, "请输入帐号!!");
				return;
			}
			if ("".equals(password) || password == null) {
				JOptionPane.showMessageDialog(null, "请输入密码!!");
				return;
			}
			User user = new User(username, password);
			CommandTranser msg = new CommandTranser();
			msg.setCmd("login");
			msg.setData(user);
			msg.setReceiver(username);
			msg.setSender(username);
			// 实例化客户端 并且发送数据 这个client客户端 直到进程死亡 否则一直存在
			Client client = new Client();
			client.sendData(msg);
			msg = client.getData();
			if (msg != null) {
				if (msg.isFlag()) {
					this.dispose();
					JOptionPane.showMessageDialog(null, "登陆成功!");
					// 显示好友列表界面
					new FriendsUI(username, client);
				} else {
					JOptionPane.showMessageDialog(this, msg.getResult());
				}
			}

		} else if (e.getSource() == sweep) {
			text_name.setText(null);
			text_pwd.setText(null);
		}

	}
把帐号密码 登录指令等封装为CommandTranser对象  然后实例化一个客户端  通过sendData(CommandTranser msg) 方法向服务器发送数据 然后通过getData方法获得服务器返回的数据。

其中CommandTranser类在服务端已经介绍 主要变量如下

private String sender = null;// 发送者
	private String receiver = null;// 接受者
	private Object data = null;// 传递的数据
	private boolean flag = false;// 指令的处理结果
	private String cmd = null;// 服务端要做的指令
	private String result = null;// 处理结果

客户端Client代码主要负责向服务端发送数据 sendData(CommandTranser msg) 和接收服务端的数据 getData()

构造方法

// 实例化时 建立连接
	public Client() {
		try {
			socket = new Socket(address, port);
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			JOptionPane.showMessageDialog(null, "服务端未开启");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			JOptionPane.showMessageDialog(null, "服务端未开启");
		}
	}

sendData(CommandTranser msg) 方法

	// 向服务端发送数据
	public void sendData(CommandTranser msg) {
		ObjectOutputStream oos = null;
		try {
			if (socket == null)
				return;
			oos = new ObjectOutputStream(socket.getOutputStream());
			oos.writeObject(msg);
		} catch (UnknownHostException e1) {
			JOptionPane.showMessageDialog(null, "服务端未开启");
		} catch (IOException e1) {
			JOptionPane.showMessageDialog(null, "服务端未开启");
		}
	}

 getData()方法

// 向服务端接收数据
	public CommandTranser getData() {
		ObjectInputStream ois = null;
		CommandTranser msg = null;
		if (socket == null)
			return null;
		try {
			ois = new ObjectInputStream(socket.getInputStream());
			msg = (CommandTranser) ois.readObject();
		} catch (IOException e) {
			return null;
		} catch (ClassNotFoundException e) {
			return null;
		}
		if ("message".equals(msg.getCmd()))
			System.out.println((String) msg.getData());
		return msg;
	}

如果服务器返回登录成功的消息 则进入好友列表界面


在登录界面 所有的好友都是我自己创建的  。陌生人知识一个摆设。。当然也可以通过服务端的数据库来加载好友列表。。以后自己慢慢更新  

这两天出现的各种各样的错误 头都炸了。。

而在好友界面  有一个鼠标双击事件  和鼠标进入好友列表,离开好友列表事件


当鼠标进入好友列表 改变背景色

// 如果鼠标进入我的好友列表 背景色变色
		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub
			JLabel label = (JLabel) e.getSource();
			label.setOpaque(true);
			label.setBackground(new Color(255, 240, 230));
		}

修改背景色之前  一定要设置为不透明  label.setOpaque(true);

不然看不到背景色

鼠标离开好友列表

		// 如果鼠标退出我的好友列表 背景色变色
		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub
			JLabel label = (JLabel) e.getSource();
			label.setOpaque(false);
			label.setBackground(Color.WHITE);
		}

当双击好友后 出现聊天框

		@Override
		public void mouseClicked(MouseEvent e) {
			// TODO Auto-generated method stub
			// 如果双击了两次 我的好友 弹出与这个好友的聊天框
			if (e.getClickCount() == 2) {
				JLabel label = (JLabel) e.getSource();
				new ChatUI(owner, label.getText(), client);
			}
		}

一旦打开聊天框  就要新建一个线程  时刻监听服务器发送的消息

thread = new ClientThread(client, chat_txt);
		thread.start();
//当前 对话框存在
		while (isOnline) {
			//I/O阻塞  接收服务端发送的数据
			CommandTranser msg = client.getData();
			if (msg != null) {
				/*
				 * 如果服务端处理数据成功  接收信息
				 * 否则   弹出对方不在线的对话框
				 */
				if (msg.isFlag()) {
					//发送时间
					Date date = new Date();
					SimpleDateFormat sdf = new SimpleDateFormat(
							"yy-MM-dd hh:mm:ss a");
					String message = msg.getSender() + "说:"
							+ (String) msg.getData() + "\t" + sdf.format(date);
					// 在聊天框添加收到的信息
					chat_txt.append(message+"\n");
				} else {
					JOptionPane.showMessageDialog(chat_txt, msg.getResult());
				}

			}
		}

而当点击了对话框的发送按钮时 将内容封装为CommandTrander对象  客户端向服务器发送数据

// 如果点击了发送按钮
		if (e.getSource() == send_btn) {
			Date date = new Date();
			SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd hh:mm:ss a");

			String message = "你说:" + message_txt.getText() + "\t"
					+ sdf.format(date);
			// 在本地文本区追加发送的信息
			chat_txt.append(message+"\n");
			// msg为客户端向服务器发送的数据
			CommandTranser msg = new CommandTranser();
			msg.setCmd("message");
			msg.setSender(owner);
			msg.setReceiver(friend);
			msg.setData(message_txt.getText());

			client.sendData(msg);
			// 发送信息完毕 写信息的文本框设空
			message_txt.setText(null);
		}


好啦  代码 就这么多。聊天过程如下


全部源码点击下载


作者:su20145104009 发表于2016/10/22 22:07:39 原文链接
阅读:109 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>