用JAVA SOCKET製作一個廣播信使的程式

來源:互聯網
上載者:User

用JAVA SOCKET製作一個廣播信使的程式

Translated by Caiyi0903(Willpower),2004.3.1 

簡介

Java是一個強大的物件導向開發語言,支援很多功能,比如,通過SOCKET編程達到的C/S通訊,基於WINDOW的編程,基於CONSOLE的編程,還有資料庫連接,圖象和聲音編程等。 JAVA多用在基於INTERNET的網路編程上,建立一些嵌入到HTML頁面中的APPLET小程式來實現。

在開始實際編寫代碼之前,為了使得概念更加清晰,需要提及幾個重要的概念。廣播信使(broadcast messenger)是要建立一個伺服器,用來負責接收和響應來自客戶機的網路訊息。這個就叫做廣播(Broadcasting),意思是發送資料包或者訊息到所有的客戶機。

這裡使用的是伺服器/客戶機(C/S)架構,因為有一台電腦扮演伺服器的角色來響應客戶機的訊息,所有其他的電腦都扮演客戶機的角色,僅僅只是發送請求到伺服器來執行它們的一些任務。Socket是串連電腦彼此的一個邏輯串連。要建立一個socket,需要提供一個連接埠號碼和一個主機IP地址/主機名稱。

多線程意味著一個進程的多個線程能夠同時運行在分配給它們的同一個處理器上,就感覺好象只有進程在運行。所以,通過多線程技術,許多客戶機可以串連伺服器的同一個連接埠。線程是佔有資源的進程或程式的一部分,比如檔案,I/O等等,它們能夠獨立運行。

Java代碼解釋

首先,我們建立一個伺服器,建立一個server和client類,並import下面幾個檔案:

import java.io.*;
import java.net.*;
import java.awt.*;

為server類設計一個interface使得從客戶機到達的請求能夠顯示在一個window form裡。一個簡單server window設計如下:

Figure 1: 一個伺服器視窗,顯示所有輸入和輸出,客戶機名和IP地址的日誌。

我們在視窗頂部建立了一個菜單,在中間建立了一個TextArea和一個Help對話方塊。我們設定視窗的容器布局管理器為流布局(FlowLayout)。這個流布局管理器以行來放置組件,當一行滿後,自動將組件換到下一行。在JAVA中也有其他的布局管理器可用,比如Border layout manager, Grid layout manager, Card layout manager, Box layout manager, 和GridBag layout manager。下面給出代碼:

public class ChatServer extends JFrame {
public ChatServer(String title)    //CONSTRUCTOR TO INITIALIZE THE
                                   //ChatServer CLASS
{
output = new TextArea (15,40);     //output IS A TextArea COMPONENT
                                   //OF THE ChatServer CLASS
output.setEditable (false);
output.setFont(f);
output.setForeground(Color.blue);

setTitle(title);         //TO SET THE TITLE OF THE CLIENT WINDOW
setJMenuBar(menuBar);    //TO INITIALIZE THE MENU BAR ON THE WINDOW
JMenu fileMenu = new JMenu("File");
JMenu colorMenu = new JMenu("Color");
JMenu helpMenu = new JMenu("Help");

//Main menu Shortcuts:
fileMenu.setMnemonic('F');
colorMenu.setMnemonic('C');
helpMenu.setMnemonic('H');

//About Dialog init:
aboutItem = new JMenuItem("About");
//aboutItem.addActionListener((ActionListener)this);
helpMenu.add(aboutItem);
addMenuItem(helpMenu,aboutAction = new AboutAction("About"));

//Initialize menu items:
menuBar.add(fileMenu);
menuBar.add(colorMenu);
menuBar.add(helpMenu);

enableEvents(AWTEvent.WINDOW_EVENT_MASK);

class AboutAction extends AbstractAction    //CREATES AN ABSTRACT
                                            //INTERNAL CLASS FOR
                                            //About
{
JOptionPane opt;
String name;
public AboutAction(String Name)

   {
   this.name=Name;
   }

//About menu event:
public void actionPerformed(ActionEvent ae)
   {
//if(ae.getSource() == aboutAction)
      {

      JOptionPane.showMessageDialog
      (opt,"ChitChat_Broadcast_Messenger/nCopyright
      Fatima_Ahmed","About_ChitChat_Broadcast_Messenger",J
      OptionPane.INFORMATION_MESSAGE);
      }

   }
}

Figure 2: ABOUT對話方塊

public static void main (String args[]) throws IOException {

ChatServer ServerWindow = new ChatServer("ChitChat Broadcast
                                         Messenger: Server Window");
    //CREATES AN OBJECT OF SERVER
Toolkit theKit = ServerWindow.getToolkit();   //TO CREATE AN OBJECT
                                              //OF ToolKit
Dimension wndSize = theKit.getScreenSize();

ServerWindow.setBounds(wndSize.width/4,wndSize.height/4,
                       wndSize.width/2,wndSize.height/2);
ServerWindow.setVisible(true);
ServerWindow.getContentPane().add ("North", output);
    //TO ADD THE TextArea (output) AT THE NORTH OF THE WINDOW
ServerWindow.getContentPane().setLayout(new FlowLayout
                                        (FlowLayout.CENTER));
    //TO SET THE LAYOUT AS CENTRALLY FLOW
ServerWindow.pack();    //TO PACK THE SERVER WINDOW WITH ABOVE
                        //INITIALIZE COMPONENTS

   if (args.length != 1)
      throw new IllegalArgumentException ("Syntax: ChatServer
                                           <port>");
   int port = Integer.parseInt (args[0]);
   String logins;
   ServerSocket server = new ServerSocket (port);
      //TO CREATE AN OBJECT FOR SERVER'S SOCKET
   while (true) {
      Socket client = server.accept ();    //CALLS THE accept()
                                           //METHOD WHENEVER THE
                                           //CLIENTS REQUEST
      System.out.println ("Accepted from " +
                           client.getInetAddress ()+
                           " with name "+logins);
      ChatHandler handler = new ChatHandler (client,yourname);
      handler.start ();    //THE BROADCASTING OF MESSAGES IS
                           //STARTED BY start() METHOD
      output.append ("/n Accepted from " +
                      client.getInetAddress ()+"/n");
   }
}

socket是通過另一個類“ChatHandler”建立的,是包含在Demo Project檔案中(譯者註:已提供下載)。現在,我們設計一個Client類:

Figure 3: Client信使視窗詢問每次串連初始化的使用者登陸名

Figure 4: 一個客戶機視窗,包含一些字型,顏色選取框和一個菜單來控制視窗。

在Client類中匯入以下檔案。我們已經建立了另一個類“SketchFrame”,它是用來定義一些客戶機視窗的interface的。我們描敘一下JAVA中的Socket類的一些準系統,並在用戶端線程上實現了start ( ), run ( ),和stop ( )方法。這個類有以下匯入的檔案:

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class ChatClient implements Runnable, WindowListener,
       ActionListener, ListSelectionListener {
   protected String host;
   protected int port;
   public TextArea output;
   protected TextField input;
   String yourname;
   SketchFrame window;

public ChatClient (String host, int port, SketchFrame window) {
    //CONSTRUCTOR INITIALIZING THE ChatClient CLASS
   this.host = host;    //host AND port WILL BE USED TO OPEN THE
                        //SOCKET
   this.port = port;
   this.yourname=JOptionPane.showInputDialog("Enter Login name:");
    //TO CREATE AN INPUT DIALOG BOX

   window.setSize(100,100);    //TO SET THE SIZE OF THE CLIENT
                               //WINDOW
   window.getContentPane().add (output,BorderLayout.CENTER);
    //TO ADD TextArea (output) AT THE CENTER OF THE WINDOW
   window.getContentPane().add (input,BorderLayout.SOUTH);
    //TO ADD THE Textbox (input) AT THE BOTTOM (SOUTH)

protected DataInputStream dataIn;
protected DataOutputStream dataOut;
protected Thread listener;

public synchronized void start () throws IOException {
    //THREAD SYNCHRONIZATION METHOD FOR STARTING BROADCAST
   if (listener == null) {
      Socket socket = new Socket (host, port);    //TO INITIALIZE
                                                  //THE SOCKET
   try {
      dataIn = new DataInputStream
         (new BufferedInputStream (socket.getInputStream ()));
      dataOut = new DataOutputStream
         (new BufferedOutputStream (socket.getOutputStream ()));
         dataOut.writeUTF (yourname+" has loggged on/n ");
         }
catch (IOException ex)
   {
      socket.close ();
      throw ex;
   }
}
   listener = new Thread (this);
   listener.start ();
   window.setVisible (true);
   }
}
public synchronized void stop () throws IOException
    //THREAD SYNCHRONIZATION METHOD FOR STOPPING THE BROADCAST
{
   if (listener != null)
      {

      listener.interrupt ();
      listener = null;
      dataOut.close ();
      }

public void run() {    //THREAD METHOD FOR READING A NEW MESSAGE
                       //LINE FROM THE CLIENT
   try {
      while (!Thread.interrupted ())
         {
         String line = dataIn.readUTF ();
         output.append (line + "/n");
         }
   }
catch (IOException ex)
   {
   handleIOException (ex);
   }
}

當使用者運行程式並在輸入框中輸入一些資訊,然後斷行符號後,start ( )方法就被調用,並建立了一個socket來初始化輸入資料流和輸出資料流,發送在用戶端輸入的訊息給伺服器,伺服器再廣播這個訊息到其他用戶端。只要對話建立,那麼run ( )將被調用,並發送訊息。當使用者退出程式時,stop ( )方法被調用,並關閉socket串連。

原始碼下載

下載demo project - 8.67 KB

Translated by Caiyi0903(Willpower),2004.3.1

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.