当前位置:天才代写 > tutorial > JAVA 教程 > 用Java Socket建造广播信使措施

用Java Socket建造广播信使措施

2017-11-11 08:00 星期六 所属: JAVA 教程 浏览:355

副标题#e#

简介

Java是一个强大的面向工具开拓语言,支持许多成果,好比,通过Socket编程到达的C/S通讯,基于Windows的编程,基于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设计如下:

用Java Socket制作广播信使法子

Figure 1: 一个处事器窗口,显示所有输入和输出,客户机名和IP地点的日志。


#p#副标题#e#

我们在窗口顶部建设了一个菜单,在中间建设了一个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);
    }
   }
  }

用Java Socket制作广播信使法子

Figure 2: ABOUT对话框

#p#副标题#e#

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类:

用Java Socket制作广播信使法子

Figure 3: Client信使窗口询问每次毗连初始化的用户登岸名

用Java Socket制作广播信使法子

Figure 4: 一个客户机窗口,包括一些字体,颜色选取框和一个菜单来节制窗口。

#p#副标题#e#

#p#分页标题#e#

在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);
 }
}

#p#分页标题#e#

当用户运行措施并在输入框中输入一些信息,然后回车后,start ( )要领就被挪用,并建设了一个socket来初始化输入流和输出流,发送在客户端输入的动静给处事器,处事器再广播这个动静到其他客户端。只要对话成立,那么run ( )将被挪用,并发送动静。当用户退出措施时,stop ( )要领被挪用,并封锁socket毗连。

 

    关键字:

天才代写-代写联系方式