使用UDP协议的JAVA网络聊天程序

本文介绍了一个基于UDP协议的简易网络聊天程序的设计与实现。通过创建客户端与服务器端,实现了消息的发送与接收功能。客户端通过按钮发送信息,服务器端则通过专门的线程接收并显示接收到的消息。

在正式编写程序之前,先单纯的分析从一端发送信息、另一端接收信息的过程。假设发送信息的是Client端程序,接受信息的是Server端程序,则UDP的Server端与Client端程序做网络通信的基本过程如下:

  • UDP的Server端程序的实现步骤:
  1. 建立DatagramSocket对象,如receSocket=new DatagramSocket(本地端port)
  2. 产生要用来接收数据的DatagramPacket对象,如receSocket=new DatatramPacket(用来接收数据的byte【】)
  3. 接收数据包,如receSocket.reveive(revePacket)
  4. 由数据封装包取得数据,如theData=revePacket.getData()
  5. 关闭DatagramSocket
  • UDP的Client端程序的实现步骤:
  1. 建立DatagramSocket对象,如sendSocket=new DatagramSocket(本地端port)
  2. 产生要用来发送数据的DatagramPacket对象,如sendSocket=new DatatramPacket(欲送出的数据byte【】,目的端口IP,目的端port)
  3. 发送数据包,如sendSocket.send(sendPacket)
  4. 关闭DatagramSocket

网络通信程序当然需要同时具备发送信息和接受信息的功能,实现这两个功能的主要做法如下:

接收文件部分:利用一个线程,接收送到本地端的数据

发送文件部分:利用一个按钮的实践,将数据传送到远程端口。

  • 具体程序如下:

 

 import java.lang.*;
import java.awt.*;
import java.net.*;
import java.awt.event.*;

public class j03130301 extends Frame implements Runnable
{
  Label L1,L2;
  TextField text1,text2;
  Button B1;
  List list1;
  public j03130301()
  {
    this.setLayout( null );
    //========================================
    L1 = new Label("对方 IP:");
    L1.setBounds(10,30,60,30);
    this.add(L1);
    L2 = new Label("发言:");
    L2.setBounds(10,70,60,30);
    this.add(L2);      
    text1 = new TextField("127.0.0.1", 20);
    text1.setBounds(75,30,200,30);
    this.add(text1);
    text2 = new TextField();
    text2.setBounds(75,70,320,30);
    this.add(text2);         
    B1 = new Button("send");
    B1.setBounds(400,70,60,30);
    B1.addMouseListener( new myMouseListener() );
    this.add(B1);
    list1 = new List(15);
    list1.setBounds(15,110,450,300);
    this.add(list1);
    //========================================
    this.addWindowListener(new WindowAdapter()
    {
      public void windowClosing(WindowEvent e)
      {
        System.exit(0);
      }
    });
    this.setTitle("使用 UDP 的网络聊天程序");
    this.setBounds(100,100,480,430);
    this.setVisible( true );
  }//public j03130301() end
  public void run() 
  {  //接收数据
     while( true )
     { //持续接收送到本地端的信息
        byte[] buf = new byte[100];//预期最多可收 100 个 byte
        try
        {        
          DatagramSocket DS = new DatagramSocket( 2222 );
                                  //用 2222 port 收
            /* 只管接收要送到本地端 2222 port 的数据包,
               不必管该数据包是从远程的那个 port 送出。 */
          DatagramPacket DP = new DatagramPacket( buf,buf.length );
                                              //将数据收到 buf 数组
          DS.receive( DP ); //接收数据包
          list1.add( "来自 " + DP.getAddress().getHostAddress()
                     + ":" + DP.getPort() + " >"         
                     + new String( buf ).trim()  );
              //此处用 new String(DP.getData()).trim() 也一样
          DS.close();
          Thread.sleep(200); //停 0.2 秒
        }
        catch(Exception excep){}
     }
  } // void run() end
 
  class myMouseListener extends MouseAdapter
  {  //送数据
    public void mouseClicked(MouseEvent e)
    { //每次 Click 按钮就发送信息到目的端主机     
      String msg = text2.getText().trim();  
      String ipStr = text1.getText().trim();
      try
      {
        DatagramSocket DS = new DatagramSocket();
                                //以任一目前可用的port 送
        DatagramPacket DP
          = new DatagramPacket( msg.getBytes(),
                                msg.getBytes().length,
                                InetAddress.getByName(ipStr),
                                2222 ); //送到远程的 2222 port
        DS.send( DP ); //送出数据包
        list1.add( "送出:" + msg.trim() ); //给自己看的记录
        DS.close();
      }
      catch(Exception excep){}
    } //void mouseClicked(MouseEvent e) end
  } //class myMouseListener end
 
  public static void main(String arg[])
  {
    j03130301 Form1 = new j03130301();     
    Thread threadObj = new Thread( Form1 );
    threadObj.start();//启动接收信息的线程
  } //void main(String arg[]) end
} //class j03130301 end

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值