📄 listen.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 + -