?? frame1.java
字號:
package chatclient;import java.awt.*;import java.awt.event.*;import javax.swing.*;//增加的包import java.io.*;import java.net.*;import java.util.*;import java.lang.Thread;import com.borland.jbcl.layout.*;/** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author not attributable * @version 1.0 */public class Frame1 extends JFrame { JPanel contentPane; JPanel jPanel1 = new JPanel(); JPanel jPanel2 = new JPanel(); XYLayout xYLayout1 = new XYLayout(); JTextArea jTextArea1 = new JTextArea(); XYLayout xYLayout2 = new XYLayout(); JLabel jLabel1 = new JLabel(); JLabel jLabel2 = new JLabel(); JTextField jTextField1 = new JTextField(); JButton jButton1 = new JButton(); JButton jButton2 = new JButton(); JTextField jTextField2 = new JTextField(); JButton jButton3 = new JButton(); JLabel jLabel3 = new JLabel(); JTextField jTextField3 = new JTextField(); XYLayout xYLayout3 = new XYLayout(); java.awt.List list1 = new java.awt.List(); ButtonGroup buttonGroup1 = new ButtonGroup(); JRadioButton jRadioButton1 = new JRadioButton(); JRadioButton jRadioButton2 = new JRadioButton(); JScrollPane jScrollPane1 = new JScrollPane(); JScrollPane jScrollPane2 = new JScrollPane();//定義數據流和網絡變量 Socket socket=null; //定義連接套接字 PrintStream ps=null; //定義打印流 Listen listen=null; //定義客戶端線程 int count=0; XYLayout xYLayout4 = new XYLayout(); XYLayout xYLayout5 = new XYLayout(); XYLayout xYLayout6 = new XYLayout(); //定義目前的連接用戶數目//Construct the frame public Frame1() { enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } //Component initialization private void jbInit() throws Exception { contentPane = (JPanel) this.getContentPane(); contentPane.setLayout(xYLayout4); this.setSize(new Dimension(400, 328)); this.setTitle("聊天客戶端"); jPanel2.setLayout(xYLayout5); jPanel1.setLayout(xYLayout6); jLabel1.setText("連接用戶"); jLabel2.setText("選擇消息發送方式"); jButton1.setText("發送"); jButton1.addActionListener(new Frame1_jButton1_actionAdapter(this)); jButton2.setText("退出"); jButton2.addActionListener(new Frame1_jButton2_actionAdapter(this)); jButton3.setText("連接"); jButton3.addActionListener(new Frame1_jButton3_actionAdapter(this)); jTextArea1.setText(""); jTextField1.setText(""); jTextField2.setEditable(false); jTextField2.setText(""); jLabel3.setText("連接用戶名"); jTextField3.setText(""); jRadioButton1.setEnabled(true); jRadioButton1.setSelected(true); jRadioButton1.setText("廣播發送"); jRadioButton2.setToolTipText(""); jRadioButton2.setSelected(false); jRadioButton2.setText("選擇發送"); jPanel1.add(jScrollPane1, new XYConstraints(5, 34, 134, 129)); jPanel1.add(jLabel2, new XYConstraints(13, 175, 105, 28)); jPanel1.add(jRadioButton1, new XYConstraints(17, 198, -1, -1)); jPanel1.add(jRadioButton2, new XYConstraints(17, 216, -1, -1)); jPanel1.add(jLabel1, new XYConstraints(16, 4, 81, 20)); jScrollPane1.getViewport().add(list1, null); contentPane.add(jTextField2, new XYConstraints(3, 283, 371, 29)); contentPane.add(jButton1, new XYConstraints(254, 245, -1, -1)); contentPane.add(jTextField1, new XYConstraints(23, 247, 215, 25)); contentPane.add(jButton2, new XYConstraints(318, 246, -1, -1)); contentPane.add(jPanel1, new XYConstraints(1, 0, 170, 246)); jPanel2.add(jTextField3, new XYConstraints(71, 3, 80, -1)); jPanel2.add(jButton3, new XYConstraints(155, 0, 65, -1)); jPanel2.add(jScrollPane2, new XYConstraints(24, 31, 194, 162)); jPanel2.add(jLabel3, new XYConstraints(0, 3, -1, -1)); jScrollPane2.getViewport().add(jTextArea1, null); contentPane.add(jPanel2, new XYConstraints(159, 1, 223, 209)); buttonGroup1.add(jRadioButton2); buttonGroup1.add(jRadioButton1); } //Overridden so we can exit when window is closed protected void processWindowEvent(WindowEvent e) { super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_CLOSING) { disconnect(); System.exit(0); } } public void disconnect(){ //斷開連接運行的方法 if(socket!=null){ try { ps.println("QUIT:"+listen.name); ps.flush(); socket.close(); count--; } catch(IOException e){ jTextArea1.append("Error:"+e); } //finally{} } } public class Listen extends Thread{ // 定義客戶端線程用來監聽服務器傳來的信息 //定義的數據成員 String name=null;//用來存儲客戶端連接以后的name 信息 DataInputStream dis=null; //用來實現客戶端接受服務器的數據的輸入流 PrintStream ps=null;//用來實現從客戶端發送數據到服務器端的打印流 Socket socket=null;//用來存儲客戶單的socket信息 Frame1 parent=null;//用來存儲當前運行的實例 public Listen (Frame1 p,String n,Socket s){//Listen 類的構造器 parent=p; name=n; socket=s; try{ //實例化兩個數據流 dis=new DataInputStream(s.getInputStream()); ps=new PrintStream(s.getOutputStream()); } catch(IOException e){ parent.jTextArea1.append("Error: "+e+"\n"); parent.disconnect(); } }//結束類的構造器 public void run(){ //線程的運行方法 String message=null; while(true){ //無限循環用于監聽信息 try{ message=dis.readLine();//讀取服務器傳來的信息 } catch(IOException e){ parent.jTextArea1.append("Error: "+e+"\n"); parent.disconnect(); } if(message==null){ //如果服務器傳來的信息為空,則斷開此次連接 parent.listen=null; parent.socket=null; parent.list1.clear(); return; } StringTokenizer str=new StringTokenizer(message,":"); //用StringTokenizer類來實現讀取分段字符 String keyword=str.nextToken(); //讀取信息頭來識別試何種信息 if(keyword.equalsIgnoreCase("PEOPLE")){ //如果讀取的是PEOPLE,則表示是服務器發送的客戶連接信息, //此時,需要刷新客戶端的用戶列表 count=0; parent.list1.clear(); while(str.hasMoreTokens()){ String st = str.nextToken(); //讀取加入的用戶名稱 parent.list1.addItem(st); //添加到用戶列表中 count++;//統計用戶數目 } jTextField2.setText("目前連接的用戶數: "+String.valueOf(count)); } else if(keyword.equalsIgnoreCase("MSG")) { //如果讀取的是MSG,則表示是服務器發送的客戶傳來的聊天信息, //此時,需要刷新客戶端的連天信息顯示區,將聊天信息顯示出來 String broadcast=str.nextToken();//接受的信息類型,是單播還是廣播 String usr=str.nextToken();//信息發送的來源 parent.jTextArea1.append(usr); parent.jTextArea1.append(str.nextToken("\0")); parent.jTextArea1.append("\n"); } else if(keyword.equalsIgnoreCase("QUIT")){ //如果關鍵字是QUIT,則判斷是服務器的關閉信息, //用戶需要用此信息來切斷此次連接 String who = str.nextToken(); if (who.equalsIgnoreCase("SERVER")) { parent.jTextArea1.append("服務器關閉\n"); try { parent.listen.stop(); parent.listen = null; parent.socket.close(); parent.socket = null; } catch (IOException e) { parent.jTextArea1.append("Error: " + e + "\n"); } parent.list1.clear(); return; } else{ parent.jTextArea1.append(who+"已經離開\n"); } } else if(keyword.equalsIgnoreCase("FAULTNAME")) { parent.jTextArea1.append("用戶名錯誤\n"); } } }//結束run方法 }//結束內部的Listen類 void jButton3_actionPerformed(ActionEvent e) { //用戶點擊“連接”按鈕的處理方法 if(socket==null){ try{ socket = new Socket(InetAddress.getLocalHost(), 4000); //使用端口8888實例化一個本地的套接字 //socket.setSoTimeout(20000); //設置連接的最長時間為20秒 if (socket != null) { ps = new PrintStream(socket.getOutputStream()); //將ps指向socket的輸出流 StringBuffer info = new StringBuffer("PEOPLE:"); //定義一個字符緩沖區存儲發送信息 //其中用PEOPLE為關鍵字,讓服務器識別為連接信息 //并將name以及IP信息用“:”分開,實現在服務器端通過用 //StringTokenizer類來讀取數據 String userinfo = jTextField3.getText() + ":" + InetAddress.getLocalHost().toString(); ps.println(info.append(userinfo)); ps.flush(); listen = new Listen(this, jTextField3.getText(), socket); listen.start(); jTextArea1.append(jTextField3.getText() + "登錄成功"+"\n"); count++; jTextField2.setText("目前連接的用戶數: " + String.valueOf(count)); } else{ jTextArea1.append(jTextField3.getText()+"登錄失敗"); } } catch(IOException ee){ jTextArea1.append(jTextField3.getText()+"登錄失敗"); disconnect(); } }//end of if }///結束“連接”方法 void jButton1_actionPerformed(ActionEvent e) { //用戶點擊“發送”按鈕的處理方法 if(socket!=null){ StringBuffer message=new StringBuffer("MSG:"); //定義一個字符緩沖區存儲發送信息 //其中用MSG為關鍵字,讓服務器識別為聊天信息 try{ String msg=new String(jTextField1.getText()); } catch(Exception ex){} if(jRadioButton1.isSelected()){ //查看選擇的發送方式為“廣播發送”還是“選擇發送” message.append("BROAD:"); } else{ message.append(list1.getSelectedItem()+":"); } message.append(listen.name+":"); ps.println(message.append(jTextField1.getText())); jTextField1.setText(""); //用打印流發送聊天信息 ps.flush(); }//結束if }//結束“發送”的處理方法 void jButton2_actionPerformed(ActionEvent e) { //用戶點擊“退出”按鈕的處理方法 disconnect(); System.exit(0); }}//end of Frame1 classclass Frame1_jButton2_actionAdapter implements java.awt.event.ActionListener { Frame1 adaptee; Frame1_jButton2_actionAdapter(Frame1 adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jButton2_actionPerformed(e); }}class Frame1_jButton1_actionAdapter implements java.awt.event.ActionListener { Frame1 adaptee; Frame1_jButton1_actionAdapter(Frame1 adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jButton1_actionPerformed(e); }}class Frame1_jButton3_actionAdapter implements java.awt.event.ActionListener { Frame1 adaptee; Frame1_jButton3_actionAdapter(Frame1 adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.jButton3_actionPerformed(e); }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -