?? clientwindow.java
字號(hào):
/*
* clientWindow.java
*
* Created on 2007年12月20日, 下午8:35
*/
/**
*
* @author Admin
*用戶會(huì)話窗口; 用戶發(fā)送和接受消息由不同線程完成;用戶講在一個(gè)特定的端口接受消息,此端口號(hào)每次登錄都會(huì)不同,但在一次登錄成功急以后的會(huì)話中相同.
* 客戶端會(huì)將此端口號(hào)發(fā)送至服務(wù)器.服務(wù)器將會(huì)把用戶名&端口號(hào)記錄下來;將發(fā)給該用戶的消息,發(fā)往該端口;因此服務(wù)器與客戶端的發(fā)送接受不在同一個(gè)socket,
* 而是在需要發(fā)送信息時(shí)臨時(shí)創(chuàng)建一個(gè)socket;這樣處理的目的是提高客戶端的并發(fā)度,而服務(wù)器可以采用相同的方法處理消息;
*/
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; //默認(rèn)偵聽端口為2003,此端口可能不可用,被修改;
public String rckey=null; //session key;在登錄時(shí)與服務(wù)器協(xié)商好的,作為參數(shù)傳遞到會(huì)話窗口;
public String filepath=null; //傳輸文件時(shí)選擇的文件路徑
public clientWindow(String un, String ip, String key) {
initComponents();
usernametextLabel.setText(un);
IPtextLabel.setText(ip);
rckey = key;
}
public void log(String log) //log函數(shù);在登錄,登出時(shí)調(diào)用;發(fā)送合法的登錄登出消息格式,正常結(jié)束連接;
{
String info = "";
if(log.equals("on"))
{
info = "%"+usernametextLabel.getText()+"%"+PORT;
}else if(log.equals("off"))
{
info = "logoff";
}else
{
JOptionPane.showMessageDialog(null,"錯(cuò)誤的登錄參數(shù)", "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 //接受消息的線程;此線程偵聽尋找一個(gè)可用端口并偵聽該端口
{
private ServerSocket sevskt = null;
public Listen()
{
mark: while(true) //循環(huán)測(cè)試端口是否可用,直到發(fā)現(xiàn)可用端口,基礎(chǔ)端口為默認(rèn)的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,"請(qǐng)求傳輸文件", "message", JOptionPane.INFORMATION_MESSAGE);
filechooser frame1 = new filechooser(null, rckey);
frame1.setTitle("檔案選擇對(duì)話方塊");
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"
}
) {
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -