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

📄 clientwindow.java

📁 QQ聊天工具的源代码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * 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 + -