2011年12月28日 星期三

[JAVA]程式分享--多人聊天室簡單版

[JAVA]程式分享--多人聊天室
此程式為SERVER端
//--------------------------------------------------------------//
// MyServer.java 2011年04月15日
//--------------------------------------------------------------//
import java.io.*;
import java.net.*;
import java.util.*;
//--------------------------------------------------------------//
//程式流程
//---MyServer  --主類別檔
//-1-main  --主程式進入點
//-2-go()   --方法  --建位連線  --等待請求連線
//     --取得連線後往下執行
//-3-Process  --內部類別 --處理程序
//-3.1-Process  --建構子 --由執行緒呼叫 --建立接收
//-3.2-run()  --方法  --執行執行緒
//-3.3-tellApiece() --方法  --告訴每人
//--------------------------------------------------------------//
//MyServer主類別檔
//--------------------------------------------------------------//
public class MyServer{
 
 Vector output;//output
 //--------------------------------------------------------------//
 //-1-主程式進入點
 //--------------------------------------------------------------//
 public static void main (String args[]){
  new MyServer().go();     
 }
 //--------------------------------------------------------------//
 //-2-建位連線
 //--------------------------------------------------------------//
 public void go() {
  //建立物件陣列
  output = new Vector();          
  try{
   //產生ServerSocket設定port:5000
   ServerSocket serverSock = new ServerSocket(8888);  
   while(true){
    //等待連線的請求--串流
    Socket cSocket = serverSock.accept();    
    //建立I/O管道
    PrintStream writer = 
     //取得Socket的輸出資料流
     new PrintStream(cSocket.getOutputStream());  
    System.out.println(writer); 
    //元件加入Vector
    output.add(writer);         
    //傳入一個Runnable物件並分派一個新的執行緒
    //建立伺服器主執行緒
    Thread t = new Thread(new Process(cSocket)); 
    //啟動執行緒
    t.start();           
    //取得連線的ip       
    System.out.println(cSocket.getLocalSocketAddress()+ 
    //執行緒的在線次數
         "有"+(t.activeCount()-1)+  
    //顯示連線人次
         "個連接");               
   } 
  }catch(Exception ex){System.out.println("連接失敗");}
 }
 //--------------------------------------------------------------//
 //-3-Process處理程序
 //--------------------------------------------------------------//
 public class Process implements Runnable{   
  //暫存資料的Buffered
  BufferedReader reader;  
  //建立一個Socket變數  
  Socket sock;            
  //----------------------------------------------------------//
  //-3.1-由執行緒呼叫---建立接收
  //----------------------------------------------------------//
  public Process(Socket cSocket)
  {
   try{
    sock = cSocket;
    //取得Socket的輸入資料流
    InputStreamReader isReader =        
    new InputStreamReader(sock.getInputStream()); 
        
    reader = new BufferedReader(isReader);
   }catch(Exception ex){
    System.out.println("連接失敗Process");
   } 
  }
  //--------------------------------------------------------------//
  //-3.2-執行執行緒
  //--------------------------------------------------------------//
  public void run(){
   String message;
   try{
       //讀取資料
    while ((message = reader.readLine())!=null){   
     System.out.println("收到"+message);
     tellApiece(message);
    }
   }catch(Exception ex){System.out.println("有一個連接離開");}
  }
  //--------------------------------------------------------------//
  //-3.3-告訴每人
  //--------------------------------------------------------------//
  public void tellApiece(String message){
   //產生iterator可以存取集合內的元素資料    
   Iterator it = output.iterator(); 
   //向下讀取元件   
   while(it.hasNext()){          
    try{
    //取集合內資料
    PrintStream writer = (PrintStream) it.next();  
    //印出
    writer.println(message); 
    //刷新該串流的緩衝。
    writer.flush();           
    }
    catch(Exception ex){
     System.out.println("連接失敗Process");
    }
   }
  }
 } 
}


此程式為CLIENT端
//--------------------------------------------------------------//
// MyClient.java 2011年04月15日
//--------------------------------------------------------------//
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
//--------------------------------------------------------------//
//程式流程
//---MyClient   --主類別檔
//-1-main()   --主程式進入點
//-2-MyClient()   --   --設定及宣告  
//-3-EstablishConnection() --方法   --建立連線
//-4-class IncomingReader --內部類別  --接收資料
//-5-actionPerformed()  --方法   --按下之動作 
//--------------------------------------------------------------//
//MyClient主類別檔
//--------------------------------------------------------------//
public class MyClient extends JFrame implements ActionListener{  
 //宣告區
 //設定名子及ip
 String    name,ip="";       
 BufferedReader  reader;           
 PrintStream  writer;
    //建立Socket變數 
 Socket    sock;
 //顯示區域
 JTextArea   incoming = new JTextArea(15,50); 
 //輸入區域
 JTextField   outgoing = new JTextField(20);     
 JLabel    jlmane   = new JLabel("你的名字:");   
 JLabel    jlip  = new JLabel("輸入ip:");   
 JTextField   jfmane   = new JTextField("無名",10);
 JTextField   jfip   = new JTextField("127.0.0.1",10);
 JLabel    state  = new JLabel("請輸入你的名字及你的名字"); 
 
 MenuBar mBar = new MenuBar();      
 //File
 Menu mFile = new Menu("檔案");
    //Save 
 MenuItem mFileSave=new MenuItem("儲存檔案");     
 //--------------------------------------------------------------//
 //-1-主程式進入點
 //--------------------------------------------------------------//
 public static void main(String[] args){
  MyClient client = new MyClient();       //
 }
 //--------------------------------------------------------------//
 //-2-設定及宣告視窗物件
 //--------------------------------------------------------------//
 MyClient (){ 
        //設定及宣告視窗物件 
  //建立視窗JFrame
  super("多入連線Client端");          
  //用來放mane及ip--設定區域
  JPanel maneipPanel  = new JPanel();   
  //建來設定按鍵 
  JButton setmaneip = new JButton("連線設定");
  //按下設定
  setmaneip.addActionListener(this);
  //加入到JPanel
  maneipPanel.add(jlmane);
  //名字
  maneipPanel.add(jfmane);         
  maneipPanel.add(jlip);
  //位子
  maneipPanel.add(jfip); 
  //設定
  maneipPanel.add(setmaneip); 
        //排版BorderLayout設定區域在上方----  
  getContentPane().add(BorderLayout.NORTH,maneipPanel);  
  //JButton("送出")
  JButton sendButton = new JButton("送出");
  //按下
  sendButton.addActionListener(this);       
  //對話區域-----
  //設置為 true,則當行的長度大於所分派的寬度時,將換行
  incoming.setLineWrap(true);         
  //設置為 true,則當行的長度大於所分派的寬度時,將在單詞邊界(空白)處換行
  incoming.setWrapStyleWord(true); 
  //不可編輯的  
  incoming.setEditable(false); 
  //JScrollPane  
  JScrollPane qScroller = new JScrollPane(incoming);
  //垂直滾動  
  qScroller.setVerticalScrollBarPolicy(
    ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
  //水平滾動
  qScroller.setHorizontalScrollBarPolicy(
    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
  JPanel mainPanel = new JPanel();       
  mainPanel.add(qScroller);
  mainPanel.add(outgoing);
  mainPanel.add(sendButton);
  //對話區域在中間------
  getContentPane().add(BorderLayout.CENTER,mainPanel);  
  
  //Menu事件
  mFileSave.addActionListener(this); 
  //加入MenuItem  
  mFile.add(mFileSave);  
  //加入Menu
  mBar.add(mFile);
  //MenuBar
  setMenuBar(mBar);
  //狀態區域在下方----
  getContentPane().add(BorderLayout.SOUTH,state);    
  setSize(600,450);
  setVisible(true);
  //離開 
  addWindowListener(new WindowAdapter()      
  {
   public void windowClosing(WindowEvent e){
    System.out.println("離開聊天室");
    System.exit(0);
   }
  });
 }
 
 //--------------------------------------------------------------//
 //-3-建立連線
 //--------------------------------------------------------------//
 private void EstablishConnection(){
  try{
   //請求建立連線
   sock = new Socket(ip,8888);      
   //建立I/O資料流
   InputStreamReader streamReader =  
     //取得Socket的輸入資料流
      new InputStreamReader(sock.getInputStream());  
   //放入暫存區
   reader = new BufferedReader(streamReader);    
   //取得Socket的輸出資料流
   
   writer = new PrintStream(sock.getOutputStream());
   //連線成功
   state.setText("網路建立-連線成功"); 
   System.out.println("網路建立-連線成功");    
   
  }catch(IOException ex ){
   System.out.println("建立連線失敗");
  }
 }
 //--------------------------------------------------------------//
 //-4-接收資料
 //--------------------------------------------------------------//
 public class IncomingReader implements Runnable{
  public void run(){
   String message;
   try{
    while ((message = reader.readLine()) != null){
    incoming.append(message+'\n');
    }
   }catch(Exception ex ){ex.printStackTrace();}
  }
 } 
 //--------------------------------------------------------------//
 //-5-按下之動作
 //--------------------------------------------------------------//
 public void actionPerformed(ActionEvent e){
  String str=e.getActionCommand();   
  //按下設定
  if(str.equals("連線設定")){
   //設定名字
   name = jfmane.getText();
   //設定ip,此程式目前無作用
   ip  = jfip.getText(); 
   //狀態
   state.setText("設定"+name+":"+ip); 
   //建立連線----
   EstablishConnection();          
   //建立接收資料執行緒----
   Thread readerThread = new Thread(new IncomingReader());  
   readerThread.start();
  //按下送出   
  }else if(str.equals("送出")){    
   //不可沒有ip及送出空白
   if((ip!=null)&&(outgoing.getText()!=""))    
   {
    try{//送出資料
        writer.println((name+":"+outgoing.getText())); 
     //刷新該串流的緩衝。
     writer.flush();         
    }catch(Exception ex ){
     System.out.println("送出資料失敗");
    }
    //清完輸入欄位
    outgoing.setText("");        
   }
  }else if (str.equals("儲存檔案"))       
  {               
   try{             
    FileWriter f=          
      new FileWriter("log.txt");     
    f.write(incoming.getText());      
    f.close();           
    state.setText("儲存檔案成功");
   }catch (IOException e2){
    state.setText("儲存檔案失敗");
   }              
  } 
 }
}

















其它文章

沒有留言:

張貼留言

標籤

Oracle (150) Oracle DB (144) Oracle_DB (143) Oracle SQL (135) JAVA (84) css-基本類 (65) MySQL (59) CSS Selector (58) jQuery (49) JavaScript-基本類 (39) Spring Boot (38) JavaScript (37) JavaScript HTML DOM (37) JavaScript-HTML_DOM (36) CSS3 (30) JAVA-基本類 (28) jQuery UI (27) Apache (23) Oracle GROUP BY (20) datepicker (20) Android (18) Oracle Date (17) c (17) JAVA-lang套件 (16) Linux (16) Oracle Sub Query (16) Spring-基本類 (16) jQuery-基本類 (16) MySQL-進階系列教學 (15) Android基本類 (14) Grails (14) Oracle join (14) SQLite (13) Spring (13) WIN7-基本類 (13) grails-基本類 (13) linux cent os (13) CKEditor (12) JAVA-流程控制類 (12) JAVA_Spring (12) PHP (11) Spring MVC (11) MySQL-基本系列教學 (10) Notepad (10) Notepad++ (10) SQLite for java (10) Windows (10) c/c++ (10) eclipse (9) jQuery-Selector (9) sqldeveloper (9) DB_Toad (8) JAVA_IDE_Eclipse (8) JavaScript-String類 (8) MySQL DB Toad (8) MySQL-DATE相關 (8) MySQL-函式相關 (8) Spring Bean (8) Android Studio (7) HTML5 (7) Hibernate (7) JAVA-OCWCD (7) JavaScript-陣列類 (7) Docker (6) JAVA-程式分享 (6) JAVA.util套件 (6) JavaScript-數學類 (6) MinGw (6) MySQL-其它類 (6) Servlet (6) centos (6) Apache_Tomcat (5) Apache套件_POI (5) CSS (5) JavaScript-Date物件 (5) JavaScript-其它類 (5) PostgreSQL (5) httpd (5) log4j (5) 基本資訊 (5) 開發工具 (5) CSS Properties (4) Dev-C++ (4) IntelliJ IDEA (4) Oracle DDL (4) Sublime (4) TortoiseSVN (4) apache_Maven (4) Android NDK (3) Eclipse IDE for C/C++ (3) Hibernate-基本類 (3) JAVA-問題 (3) JAVA-綀習分享 (3) JVM (3) Linux 指令 (3) Proxy Server (3) Spring Mobile (3) Spring web (3) Squid (3) VirtualBox (3) maven (3) zk (3) 生活其它 (3) Bootstrap (2) Filter (2) JAVA_IO (2) JAVA_其它_itext套件 (2) JBoss-問題 (2) JSP (2) Jboss (2) Listener (2) MySQL-語法快速查詢 (2) Spring AOP (2) Spring Batch (2) Spring Boot Actuator (2) Spring i18n (2) Subversive (2) Tomcat 8 (2) UML (2) WebJars (2) WinMerge (2) c++ (2) c語言綀習題 (2) jQuery Mobile (2) jQuery-事件處理 (2) jQuery-套件類 (2) putty (2) svn (2) weblogic (2) Apache_JMeter (1) Apache套件_BeanUtils (1) Apache套件_StringUtils (1) Base64 (1) Google API (1) HTML5-基本類 (1) Heap (1) JAVA 7 (1) JAVA SE 、JAVA EE、JAVA ME (1) JAVA 日期 (1) JAVA-OCJP (1) JAVA-WEB (1) JAVA_IDE (1) JAVA其它 (1) JBoss Server (1) JDK (1) JMX (1) JRE (1) Java RMI (1) Java String (1) Joda Time (1) Linux_其它 (1) MySQL教學 (1) Oracle_VirtualBox (1) SQL Server (1) SWT (1) Session (1) Stack (1) Struts 2 (1) Tool (1) ZK Studio (1) csv (1) grails-其它類 (1) jQuery-進階 (1) java mail (1) java web (1) java8 (1) jsoup (1) mockmvc (1) modules (1) tomcat (1) win10 (1) 其它類 (1) 圖片工具 (1) 模擬器 (1) 讀書分享 (1) 開發資訊 (1)

精選文章

初學 Java 的 HelloWorld 程式

撰寫一個JAVA程式 public class HelloWorld{ public static void main(String[ ] args){ System.out.println("我第一支Java程式!!"); } } ...