大学期间的课程设计,实现像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 {
//
}
}
}
运行结果截图: