⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listen.java

📁 JAVA 聊天室源码
💻 JAVA
字号:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.StringTokenizer;


class Listen extends Thread // 客户端线程类用来监听服务器传来的信息
{
	String name = null; // 用来存储客户端连接后的name信息
	BufferedReader fromServer = null; // 用来实现客户端接受服务器数据的输入流
	PrintStream ps = null; // 用来实现从客户端发送数据到服务器的打印流
	Socket socket = null; // 用来存储客户端的socket信息
	chatClient parent = null; // 用来存储当前运行的app实例

	public Listen(chatClient p, String n, Socket s) // Listen类的构造器
	{
		// 接受参数
		parent = p;
		name = n;
		socket = s;

		try {
			// 实例化两个数据流
			fromServer = new BufferedReader(new InputStreamReader(socket
					.getInputStream()));
			ps = new PrintStream(socket.getOutputStream());

		} catch (IOException e) {
			System.out.println("Error:" + e);

		}
		this.start();
	} // end of Listen constractor

	public void run() // 线程运行方法
	{
		String msg = null;
		while (true) {
			try {
				msg = fromServer.readLine();
			} // 读取从服务器传来的信息
			catch (IOException e) {
				System.out.println("Error:" + e);
				// parent.disconnect();
			}

			StringTokenizer st = new StringTokenizer(msg, ":"); // 用StringTokenizer类来实现读取分段字符
			String keyword = st.nextToken(); // 读取信息头即关键字用来识别是何种信息

			if (keyword.equals("PEOPLE")) // 如果是PEOPLE则是服务器发来的客户连接信息
			// 主要用来刷新客户端的用户列表
			{
				parent.model.removeAllElements();// 先抹去列表的所有用户
				parent.model.addElement("当前在线人列表");
				parent.model.addElement("所有人");
				while (st.hasMoreTokens()) // 遍历st取得目前所连接的客户并将其添加进JList当中
				{
					String str = st.nextToken();// 获取用户姓名
					// String welcome=st.nextToken();
					// String oldText=parent.jtextarea.getText();
					// parent.jtextarea.setText(oldText+"\n"+welcome);
					parent.model.addElement(str);// 添加进来
				}

			}
			if (keyword.equals("WELCOME"))// 如果是welcom则显示欢迎信息

			{
				String welcome = st.nextToken();
				String oldText = parent.jtextarea.getText();// 获得原来文本区域的内容
				parent.jtextarea.setText(oldText + "\n" + welcome);// 把欢迎内容添加进来
				parent.jscrollpane.getVerticalScrollBar().setValue(
						parent.jscrollpane.getVerticalScrollBar().getMaximum());

			}

			if (keyword.equals("MSG")) // 如果关键字是MSG则是服务器传来的公聊信息
			// 主要用来刷新客户端聊天信息区将每个客户的聊天内容显示出来
			{
				String usr = st.nextToken();
				String oldMessage = parent.jtextarea.getText();// 获得原来文本区域的内容
				parent.jtextarea.setText(oldMessage + "\n" + usr);// 把聊天内容添加进来
				parent.jscrollpane.getVerticalScrollBar().setValue(
						parent.jscrollpane.getVerticalScrollBar().getMaximum());

			}
			if (keyword.equals("PRIVATE"))// 如果是private表示传过来的是私聊的内容
			{
				String text = (String) parent.textCust.getText();
				String custName = st.nextToken();

				String receiver = st.nextToken();

				String pm = st.nextToken();

				if (name.equals(custName) || name.equals(receiver))// 在客户端判断是否是发送私聊这句话的人或者是接受这句话的人,如果是就显示在其客户端
				{

					String om = parent.jtextarea.getText();
					String all = custName + "对" + receiver + "悄悄地说:" + pm;
					parent.jtextarea.setText(om + "\n" + all);
					parent.jscrollpane.getVerticalScrollBar().setValue(
							parent.jscrollpane.getVerticalScrollBar()
									.getMaximum());
				}

			} else if (keyword.equals("QUIT")) // 如果关键字是QUIT则是服务器关闭的信息
			// 用来切断此次连接
			{
				String quitName = st.nextToken();

				String old = parent.jtextarea.getText();
				String quitMessage = quitName + "手轻轻一挥离开了聊天室";
				parent.jtextarea.setText(old + "\n" + quitMessage);
				parent.jscrollpane.getVerticalScrollBar().setValue(
						parent.jscrollpane.getVerticalScrollBar().getMaximum());

			}
		}

	} // end of run method
} // end of Listen inner class

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -