基于UDP模拟QQ(课程设计)

大学期间的课程设计,实现像QQ一样的双方通信

//package nettest;//Eclipse中运行不要此行,但在JBuilder中运行需加上
/*该程序实现了两进程间的相互通信,可以在两不同的机器上运行
 * 该程序主要是为了练习UDP数据报的收发,了解UDP的通信原理*/

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.net.*;
import java.io.*;
public class UDPtest014 {
  static JTextArea tSend;
  static JTextArea tShow;
  static JTextField tfip;
  static JLabel lab;
  static List lst;
  static JFrame jf;
  static DatagramSocket ds = null;
  static final int sendPort = 5432;//5432;
  static final int recvPort = 5678;//5678;
  public UDPtest014(){
    jf = new JFrame("模拟QQ");
    Toolkit kit =Toolkit.getDefaultToolkit();
    Image image=kit.createImage("D:\\jbproject\\netTest\\src\\nettest\\1471.jpg");
    jf.setIconImage(image);
    jf.addWindowListener(new windowlistene());

    try {
      ds = new DatagramSocket(sendPort);
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }

    JPanel p1 = new JPanel();
    JPanel p11 = new JPanel();
    JPanel p111 = new JPanel();
    JPanel p112 = new JPanel();
    JPanel p12 = new JPanel();
    JPanel p121 = new JPanel();
    JPanel p1211 = new JPanel();
    JPanel p1212 = new JPanel();
    JPanel p122 = new JPanel();
    JPanel p2 = new JPanel();
    JPanel p21 = new JPanel();
    JPanel p22 = new JPanel();

    JButton bt1 = new JButton("button1");
    JButton bt2 = new JButton("button2");
    JButton btSend = new JButton("发送");
    btSend.addActionListener(new buttonListene());
    JButton btCanc = new JButton("关闭");
    btCanc.addActionListener(new buttonListene());

    tSend = new JTextArea(3, 26);//待发送信息输入区
    //tSend = new TextArea("",3,22,TextArea.SCROLLBARS_VERTICAL_ONLY);
    tShow = new JTextArea(12, 26);//信息显示区
    tSend.setLineWrap(true); //设置换行
    tShow.setLineWrap(true);//设置换行

    lab = new JLabel("待填写……");
    lst = new List(16);
    tfip = new JTextField(12);//输入对方ip

    p1.setBackground(Color.BLACK);
    p11.setBackground(Color.GREEN);
    p2.setBackground(Color.BLUE);
    p21.setBackground(Color.RED);
    p22.setBackground(Color.yellow);

    p1.setLayout(new BorderLayout());
    p1.add(p11, BorderLayout.CENTER);
    p1.add(p12, BorderLayout.SOUTH);
    p2.setLayout(new BorderLayout());
    p2.add(p21, BorderLayout.NORTH);
    p2.add(p22, BorderLayout.CENTER);
    JScrollPane jp1 = new JScrollPane(tShow);
    p111.add(jp1);
    p112.add(bt2);
    JScrollPane jp2 = new JScrollPane(tSend);
    p121.setLayout(new GridLayout(1,2));
    p121.add(p1211);
    p1211.add(tfip);
    p121.add(p1212);
    p1212.add(btCanc);
    p1212.add(btSend);
    p122.add(jp2);

    p21.add(lab);
    p22.add(lst);
    p11.setLayout(new BorderLayout());
    p11.add(p111, BorderLayout.CENTER);
    p11.add(p112, BorderLayout.NORTH);

    p12.setLayout(new BorderLayout());
    p12.add(p121, BorderLayout.CENTER);
    p12.add(p122, BorderLayout.NORTH);

    Container ct = jf.getContentPane();
    ct.add(p1, BorderLayout.CENTER);
    ct.add(p2, BorderLayout.EAST);

    jf.setSize(440, 380);
    jf.setVisible(true);

  }
  public static void main(String[] args) {
    new UDPtest014();
    new Thread(new Runnable()//接收数据报
              {
                public void run()
                {
                  byte buf[] = new byte[1024];
                  DatagramPacket dp = new DatagramPacket(buf,buf.length);
                  while(true)
                  {
                    try {
                      ds.receive(dp);
                      tShow.append(dp.getAddress().getHostAddress()+"said:\n");
                      tShow.append(new String(buf,
                                              0,
                                              dp.getLength())+"\n");
                      //lst.add(new String(buf,0,dp.getLength()),0);
                      //lst.add(new String(buf,0,dp.getLength())+"from"+dp.getAddress().getHostAddress(),0);
                      UDPtest014.tShow.setCaretPosition(UDPtest014.tShow.getText().length());
                    }
                    catch (Exception ex) {
                      if(!ds.isClosed()){
                        ex.printStackTrace();
                      }
                    }
                  }
                }
              }).start();

  }
}
class windowlistene extends WindowAdapter
{
  public void windowClosing(WindowEvent e)
  {
    UDPtest014.ds.close();
    System.exit(0);
  }
}

class buttonListene implements ActionListener//发送数据报
  {
    static String strSend;
    public void actionPerformed(ActionEvent e)
    {
      if (e.getActionCommand().equals("发送")) {
        byte[]buf = new byte[1024];
        buf = UDPtest014.tSend.getText().getBytes();
        try {
          DatagramPacket dp = new DatagramPacket(buf,
                                                 buf.length,
                                                 InetAddress.getByName(UDPtest014.tfip.getText()),
                                                 UDPtest014.recvPort);
          UDPtest014.ds.send(dp);
          UDPtest014.tShow.append(dp.getAddress().getHostAddress()+"said:\n");
          UDPtest014.tShow.append(new String(buf,
                                             0,
                                             dp.getLength())+"\n");
          UDPtest014.tShow.setCaretPosition(UDPtest014.tShow.getText().length());
        }
        catch (Exception ex) {
          ex.printStackTrace();
        }
        UDPtest014.tSend.setText("");
      }
      else if (e.getActionCommand().equals("关闭")) {
        UDPtest014.ds.close();
        System.exit(0);
      }
      else {
        //
      }
    }
  }

运行结果截图:

转载于:https://my.oschina.net/chwencong/blog/2209156

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值