📄 readthread.java
字号:
package client.thread;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.StyledDocument;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import utils.InfoPacket;
import utils.StaticUtils;
import client.chat.chatpane.ChatFrame;
import client.chat.node.UserNode;
/**
* 客户端的收发包线程.
* @author 洪景泉
*
*/
public class ReadThread extends Thread {
private ChatFrame chatFrame = null;
private InputStream is = null;
private OutputStream os=null;
private String userID=null;
private String to=null;
private String sArr[]=null;
private JButton btn1=null;
private JButton btn2=null;
/**
*登录窗口调用该构造函数
* @param chatFrame 主窗体对象
* @param userID 当前用户ID
* @param is 输入流
* @param os 输出流
*/
public ReadThread(ChatFrame chatFrame,String userID, InputStream is,OutputStream os) {
this.chatFrame = chatFrame;
this.is = is;
this.os=os;
this.userID=userID;
}
public void run() {
while (true) {
// 睡眠
try {
sleep(20);
} catch (Exception ex) {
ex.printStackTrace();
}
// 接受信息
InfoPacket dataPacket = null;
try {
byte[] bs = new byte[1024];
is.read(bs);
dataPacket = new InfoPacket(bs);
} catch (SocketException e) {
JOptionPane.showMessageDialog(chatFrame, "与服务器连接断开","提示",JOptionPane.ERROR_MESSAGE);
System.exit(0);
e.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
// 上线包
if (dataPacket.getType()==InfoPacket.UP) {
//System.out.println("收到上线包");
//HashMap IDMap = dataPacket.getDatas();
String IDMap=dataPacket.getDatas();
upDown(IDMap, "up");
}
//下线包
else if (dataPacket.getType()==InfoPacket.DOWN) {
//System.out.println("收到下线包");
//HashMap IDMap = dataPacket.getDatas();
String IDMap=dataPacket.getDatas();
upDown(IDMap, "down");
if(IDMap.equals(userID)){
JOptionPane.showMessageDialog(chatFrame, "你已被强制下线,窗口将关闭","提示",JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
System.out.println("收到下线包");
}
// 公告包
if (dataPacket.getType()==InfoPacket.AFFICHE) {
String affiche =dataPacket.getDatas();
chatFrame.getRPane().getTextArea().setText(affiche);
}
//聊天包
if (dataPacket.getType()==InfoPacket.CHAT) {
String from = dataPacket.getFrom();
String []arr=from.split(":");
String to = dataPacket.getTo();
// int tag = from.indexOf(":");
String chatInfo=dataPacket.getDatas();
JTextPane tpShow = chatFrame.getLPane().getShowText();
StyledDocument showDoc = tpShow.getStyledDocument();
tpShow.setEditable(true);
//System.out.println((String)chatInfo.get("Info"));
try {
SimpleDateFormat sdf = new SimpleDateFormat ("HH:mm:ss");
showDoc.insertString(showDoc.getLength(),arr[1]+" "+sdf.format(new Date())+"\n",null);
showDoc.insertString(showDoc.getLength(),chatInfo, null);
showDoc.insertString(showDoc.getLength(), "\n", null);
// 把当前用户收到的聊天记录放在聊天记录对话框里面
chatFrame.getLPane().getCd().getChatHistory().append(" "+arr[1]+" "+sdf.format(new Date())+"\n");
chatFrame.getLPane().getCd().getChatHistory().append(" "+chatInfo+"\n");
} catch (Exception ex) {
ex.printStackTrace();
}
}
//收到发送文件请求包
if(dataPacket.getType()==InfoPacket.FILE){
// System.out.println("from to ");
// System.out.println(dataPacket.getFrom());
// System.out.println(dataPacket.getTo());
String[] from= dataPacket.getFrom().split(":");
to=from[0];
JTextPane tpShow = chatFrame.getLPane().getShowText();
StyledDocument showDoc = tpShow.getStyledDocument();
btn1=new JButton("保存");
btn1.setEnabled(true);
btn2=new JButton("拒绝");
btn2.setEnabled(true);
sArr=dataPacket.getDatas().split(",");
try {
SimpleDateFormat sdf = new SimpleDateFormat ("HH:mm:ss");
String currentuser=(String)StaticUtils.currentUser.get("userName");
showDoc.insertString(showDoc.getLength(),currentuser+" "+sdf.format(new Date())+"\n",null);
showDoc.insertString(showDoc.getLength(),"接收文件:"+sArr[0],null);
tpShow.setCaretPosition(showDoc.getLength());
tpShow.insertComponent(btn1);
showDoc.insertString(showDoc.getLength(),"还是",null);
tpShow.setCaretPosition(showDoc.getLength());
tpShow.insertComponent(btn2);
showDoc.insertString(showDoc.getLength(),"\n",null);
} catch (BadLocationException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
btn1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
//System.out.println("接收");
//随机生成端口号
int ran=0;
while(true){
ran=(int)( Math.random()*10000);
if(ran>3000)break;
}
try {
String port=String.valueOf(ran);
String hostIP=java.net.InetAddress.getLocalHost().getHostAddress();
// System.out.println("to"+to);
InfoPacket infoPacket = new InfoPacket(InfoPacket.FILE_RESP,"true","3:"+to,hostIP+","+port);
os.write(infoPacket.toByteArray());
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
AcceptFileThread at = new AcceptFileThread(chatFrame,ReadThread.this.sArr[1],ReadThread.this,ran);
at.start();
}
});
btn2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
//System.out.println("拒绝");
InfoPacket infoPacket = new InfoPacket(InfoPacket.FILE_RESP,"false","3:"+to,"");
try {
os.write(infoPacket.toByteArray());
} catch (Exception ex) {
ex.printStackTrace();
}
btn1.setEnabled(false);
btn2.setEnabled(false);
JTextPane tpShow = chatFrame.getLPane().getShowText();
StyledDocument showDoc = tpShow.getStyledDocument();
SimpleDateFormat sdf = new SimpleDateFormat ("HH:mm:ss");
String currentuser=(String)StaticUtils.currentUser.get("userName");
try {
showDoc.insertString(showDoc.getLength(),currentuser+" "+sdf.format(new Date())+"\n",null);
showDoc.insertString(showDoc.getLength(),"已经拒绝了对方的请求\n",null);
} catch (BadLocationException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
}
}
});
}
//收到接受文件请求包
if(dataPacket.getType()==InfoPacket.FILE_RESP){
// 对方接受了请求
if(dataPacket.getFrom().equals("true")){
String []sArr=dataPacket.getDatas().split(",");
sendFileThread sFThread=new sendFileThread(chatFrame,sArr[0],sArr[1]);
sFThread.start();
}else{//对方拒绝了请求
JTextPane tpShow = chatFrame.getLPane().getShowText();
StyledDocument showDoc = tpShow.getStyledDocument();
SimpleDateFormat sdf = new SimpleDateFormat ("HH:mm:ss");
String currentuser=(String)StaticUtils.currentUser.get("userName");
try {
showDoc.insertString(showDoc.getLength(),currentuser+" "+sdf.format(new Date())+"\n",null);
showDoc.insertString(showDoc.getLength(),"对方拒绝你的请求\n",null);
} catch (BadLocationException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}
}
}
// 处理上下线
private void upDown(String sid, String tag) {
Object object = StaticUtils.usersNodeMap.get(sid);
DefaultMutableTreeNode dmtn = (DefaultMutableTreeNode) object;
Object dataObj = dmtn.getUserObject();
UserNode userData = (UserNode) dataObj;
DefaultTreeModel dtModel = (DefaultTreeModel) chatFrame.getRPane().getUserTree().getModel();
DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) dmtn
.getParent();
dtModel.removeNodeFromParent(dmtn);
if (tag.equals("up")) {
userData.setUserOnline("1");
dtModel.insertNodeInto(dmtn, parentNode, 0);
} else if (tag.equals("down")) {
userData.setUserOnline("0");
//System.out.println("下线");
dtModel .insertNodeInto(dmtn, parentNode, parentNode.getChildCount());
}
}
public JButton getBtn1() {
return btn1;
}
public JButton getBtn2() {
return btn2;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -