java图形化界面UDP简单的通信

package 实验14;

/**
 *     只需要在重新复制一个类   修改接口  和 类名  就可以实现简单的通信了      新手所写   大家见谅

*      另外   我的文本区并没有添加滚动面板    还有  如果要添加滚动面板   需要在接收类设置jta1.setCaretPosition(jta1.getText().length());
 */
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class UDP通讯2 {

    public static void main(String[] args) {
        new UDPInterface2("李四");
    }

}

class UDPInterface2 {
    String name = "";
    JFrame jf = null;
    JButton jb1 = new JButton("发送");
    JButton jb2 = new JButton("清屏");
    JTextField jtf1 = new JTextField(20);
    JTextField jtf2 = new JTextField(10);
    JTextField jtf3 = new JTextField(10);
    JLabel jl1 = null;
    JTextArea jta1 = new JTextArea(500, 400);
    JTextArea jta2 = new JTextArea(100, 400);
    JPanel jp1 = new JPanel();
    JPanel jp2 = new JPanel();
    static int sendPort = 58202;
    static int receivePort = 45670;
    boolean flag = true;
    // static int sendPort = 45670;
    // static int receivePort = 58202;
    static String IP = "127.0.0.255"; // 广播地址
    // boolean flag = false;
    boolean isSend = false;

    public UDPInterface2(String name) {
        new Thread(new UDPReceiver()).start();
        this.name = name;
        jf = new JFrame(this.name + "UDP网络通讯");
        jtf1.setText(IP);
        jta1.setEditable(false);
        jtf2.setText(String.valueOf(receivePort));
        jtf3.setText(sendPort + "");
        jl1 = new JLabel("当前正在监听" + receivePort + "端口", JLabel.CENTER);
        jp1.setLayout(null);
        jp1.setBounds(0, 0, 1000, 500);

        jta1.setBounds(0, 0, 1000, 300);
        jta2.setBounds(0, 300, 1000, 200);

        jp1.add(jta1);
        jp1.add(jta2);
        jta1.setBackground(Color.GRAY);
        jta1.setFont(new Font("微软雅黑", Font.BOLD, 20));
        jta1.setText("HelloWorld!\n");
        jta1.setForeground(Color.GREEN);
        jp2.add(jtf1);
        jp2.add(new JLabel("接收端口:"));
        jp2.add(jtf2);
        jp2.add(new JLabel("发送端口:"));
        jp2.add(jtf3);
        jp2.add(jb1);
        jp2.add(jb2);
        jf.add(jp1);
        jf.add(jp2, BorderLayout.SOUTH);
        jf.add(jl1, BorderLayout.NORTH);
        jf.setBounds(300, 300, 1000, 600);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.addWindowListener(new WL());
        ActionListener AL = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (e.getSource() == jb1) { // 发送

                    isSend = true;

                    new Thread(new UDPSend()).start();

                    // System.out.println(jta2.getText());

                } else if (e.getSource() == jb2) {// 清屏
                    jta1.setText("");
                    jta2.setText("");
                } else if (e.getSource() == jtf1) { // IP
                    IP = jtf1.getText();
                } else if (e.getSource() == jtf2) { // PORT
                    receivePort = Integer.parseInt(jtf2.getText());
                    jl1.setText("当前正在监听" + receivePort + "端口");
                    jf.validate();
                } else if (e.getSource() == jtf3) {
                    sendPort = Integer.parseInt(jtf3.getText());
                    jf.validate();
                }

            }
        };
        jb1.addActionListener(AL);
        jb2.addActionListener(AL);
        jtf1.addActionListener(AL);
        jtf2.addActionListener(AL);
        jtf3.addActionListener(AL);
    }

    class UDPSend implements Runnable {

        @Override
        public void run() {

            try {
                DatagramSocket ds = new DatagramSocket();

                String str = jta2.getText();
                byte[] bytes = str.getBytes();
                DatagramPacket dp = new DatagramPacket(bytes, bytes.length, InetAddress.getByName(IP), sendPort);
                ds.send(dp);
                jta2.setText("");
                isSend = false;
                ds.close();

            } catch (SocketException e) {
                e.printStackTrace();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {

                e.printStackTrace();
            } finally {
//                isSend = false;
                
            }

        }
    }

    class UDPReceiver implements Runnable {

        @Override
        public void run() {
            try {
                DatagramSocket ds = new DatagramSocket(receivePort);
                byte[] bytes = new byte[1024];
                DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
                while (flag) {
                    ds.receive(dp);
                    String str = new String(dp.getData(), 0, dp.getLength());
                    // System.out.println("收到" + dp.getAddress().getHostAddress() + "发送的数据-----" +
                    // str);
                    str = "收到" + dp.getAddress().getHostAddress() + "发送的数据-----" + str;
                    String temp = jta1.getText();
                    temp += str;
                    jta1.setText(temp + "\n\n");

                }
                ds.close();
            } catch (SocketException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }

        }
    }
    
    class WL extends WindowAdapter{
        @Override
        public void windowClosed(WindowEvent e) {
            flag = false;
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值