📄 clientwindow.java
字号:
/*
* clientWindow.java
*
* Created on 2007年12月20日, 下午8:35
*/
/**
*
* @author Admin
*用户会话窗口; 用户发送和接受消息由不同线程完成;用户讲在一个特定的端口接受消息,此端口号每次登录都会不同,但在一次登录成功急以后的会话中相同.
* 客户端会将此端口号发送至服务器.服务器将会把用户名&端口号记录下来;将发给该用户的消息,发往该端口;因此服务器与客户端的发送接受不在同一个socket,
* 而是在需要发送信息时临时创建一个socket;这样处理的目的是提高客户端的并发度,而服务器可以采用相同的方法处理消息;
*/
import java.io.*;
import java.net.*;
import java.lang.*;
import javax.swing.*;
import java.awt.Container.*;
import java.net.BindException;
public class clientWindow extends javax.swing.JFrame {
/** Creates new form clientWindow */
public int PORT=2003; //默认侦听端口为2003,此端口可能不可用,被修改;
public String rckey=null; //session key;在登录时与服务器协商好的,作为参数传递到会话窗口;
public String filepath=null; //传输文件时选择的文件路径
public clientWindow(String un, String ip, String key) {
initComponents();
usernametextLabel.setText(un);
IPtextLabel.setText(ip);
rckey = key;
}
public void log(String log) //log函数;在登录,登出时调用;发送合法的登录登出消息格式,正常结束连接;
{
String info = "";
if(log.equals("on"))
{
info = "%"+usernametextLabel.getText()+"%"+PORT;
}else if(log.equals("off"))
{
info = "logoff";
}else
{
JOptionPane.showMessageDialog(null,"错误的登录参数", "error", JOptionPane.ERROR_MESSAGE);
}
String message = EncryptAndDecrypt.encryption(info, rckey, "RC4");
try{
Socket skt = new Socket("127.0.0.1",2500);
DataOutputStream dos = new DataOutputStream(skt.getOutputStream());
dos.writeBytes(message+"&"+usernametextLabel.getText());
dos.close();
skt.close();
}catch(UnknownHostException unex)
{
System.err.println(unex);
}catch(IOException ioex)
{
System.err.println(ioex);
}
}
class Listen extends Thread //接受消息的线程;此线程侦听寻找一个可用端口并侦听该端口
{
private ServerSocket sevskt = null;
public Listen()
{
mark: while(true) //循环测试端口是否可用,直到发现可用端口,基础端口为默认的2003
{
try{
sevskt = new ServerSocket(PORT);
break;
}catch(java.net.BindException e)
{
PORT++;
continue mark;
}catch(IOException ioex)
{
System.err.println(ioex);
}
}
log("on");
}
public void run()
{
try{
while(true)
{
Socket skt = sevskt.accept();
BufferedReader binReader = new BufferedReader(new InputStreamReader(skt.getInputStream()));
String message = binReader.readLine();
message = EncryptAndDecrypt.decryption(message, rckey, "RC4");
if(message.equals("file"))
{
JOptionPane.showMessageDialog(null,"请求传输文件", "message", JOptionPane.INFORMATION_MESSAGE);
filechooser frame1 = new filechooser(null, rckey);
frame1.setTitle("档案选择对话方块");
frame1.setSize(550,350);
frame1.setVisible(true);
}else if(message.endsWith("&"))
{
String users[] = message.split("&");
for(int i=0; i<users.length&&users[i]!=null; i++)
{
activeuserTab.setValueAt(users[i],i,0);
}
}else if(message.contains(":")){
int pos = message.indexOf(":");
String head = message.substring(0, pos);
String load = message.substring(pos+1, message.length());
messageTA.append(head + ":\n" + load+"\n");
}else{
}
binReader.close();
skt.close();
}
}catch(UnknownHostException unex)
{
System.err.println(unex);
}catch(IOException ioex)
{
System.err.println(ioex);
}
}
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" 生成的代码 ">//GEN-BEGIN:initComponents
private void initComponents() {
jScrollPane4 = new javax.swing.JScrollPane();
jTable1 = new javax.swing.JTable();
jScrollPane3 = new javax.swing.JScrollPane();
jTable2 = new javax.swing.JTable();
jScrollPane1 = new javax.swing.JScrollPane();
messageTA = new javax.swing.JTextArea();
jScrollPane2 = new javax.swing.JScrollPane();
sendtextTA = new javax.swing.JTextArea();
sendBtn = new javax.swing.JButton();
privateBtn = new javax.swing.JButton();
usernameLabel = new javax.swing.JLabel();
usernametextLabel = new javax.swing.JLabel();
IPLabel = new javax.swing.JLabel();
IPtextLabel = new javax.swing.JLabel();
jScrollPane5 = new javax.swing.JScrollPane();
activeuserTab = new javax.swing.JTable();
transmitBtn = new javax.swing.JButton();
logoffBtn = new javax.swing.JButton();
jTable1.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null}
},
new String [] {
"Title 1", "Title 2", "Title 3", "Title 4"
}
));
jScrollPane4.setViewportView(jTable1);
jTable2.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null}
},
new String [] {
"Title 1", "Title 2", "Title 3", "Title 4"
}
));
jScrollPane3.setViewportView(jTable2);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
messageTA.setColumns(20);
messageTA.setEditable(false);
messageTA.setRows(5);
messageTA.addAncestorListener(new javax.swing.event.AncestorListener() {
public void ancestorMoved(javax.swing.event.AncestorEvent evt) {
}
public void ancestorAdded(javax.swing.event.AncestorEvent evt) {
messageTAAncestorAdded(evt);
}
public void ancestorRemoved(javax.swing.event.AncestorEvent evt) {
}
});
jScrollPane1.setViewportView(messageTA);
sendtextTA.setColumns(20);
sendtextTA.setRows(5);
jScrollPane2.setViewportView(sendtextTA);
sendBtn.setText("send");
sendBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
sendBtnActionPerformed(evt);
}
});
privateBtn.setText("private");
privateBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
privateBtnActionPerformed(evt);
}
});
usernameLabel.setText("Username");
usernametextLabel.setText("111");
IPLabel.setText("IP address");
IPtextLabel.setText("122");
activeuserTab.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null},
{null},
{null},
{null},
{null},
{null},
{null},
{null}
},
new String [] {
"User online"
}
) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -