用Java 写了一个简单的聊天软件 使用UDP,但是总是收不到消息?

发布于 2022-09-04 20:22:14 字数 4675 浏览 7 评论 0

用Java 写了一个简单的聊天软件 使用UDP,但是总是收不到消息,大神看看代码哪里出问题了。

package com.window;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Logger;

/**
 * Created by young on 2017/4/19.
 */
public class MainWindow {

    private JLabel lb_addIp;
    private JButton btn_add;
    private JPanel jp_qq;
    private JLabel lb_selectIP;
    private JComboBox<String> cb_selectIP;
    private JTextField tf_addip;
    private JTextArea ta_charHistory;
    private JTextField tf_input;
    private JButton btn_submit;
    private JLabel lb_charHistory;
    private JLabel lb_message;
    private JTextPane tp;

    private String ip;
    private String sendMessage;

    private int sendport = 10023;

    private int receviceport = 10024;

    private DefaultListModel<String> listModel = new DefaultListModel<String>();
    public String name;
    private List<String> messageList = new ArrayList<>();

    public MainWindow() {

        btn_add.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                ip = tf_addip.getText();
                Object[] com = new Object[]{ip};
                cb_selectIP.addItem(ip);
            }
        });
        btn_submit.addMouseListener(new MouseAdapter() {
            Logger logger = Logger.getLogger("submit");

            @Override
            public void mouseClicked(MouseEvent e) {
                if (ip == null) {
                    lb_message.setForeground(Color.red);
                    lb_message.setText("请输入IP。");
                    return;
                }
                try {
                    InetAddress inetAddress = InetAddress.getByName(ip);
                    if (!inetAddress.isReachable(2000)) {
                        lb_message.setForeground(Color.red);
                        lb_message.setText("无法链接该地址!");
                        return;
                    }
                } catch (IOException e1) {
                    e1.printStackTrace();
                }

                sendMessage = tf_input.getText();

                logger.info("sendMessage" + sendMessage);


                new Thread(() -> {
                    send(sendMessage);
                    lb_message.setForeground(Color.green);
                    lb_message.setText("发送成功。");
                }).start();
                new Thread(() -> {
                    receive();
                }).start();
            }
        });

    }

    public void receive() {
        DatagramSocket datagramSocket = null;
        try {
            datagramSocket = new DatagramSocket(sendport, InetAddress.getByName(ip));
            byte[] buf = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
            datagramSocket.receive(datagramPacket);
            String id = datagramPacket.getAddress().getHostAddress();
            int port = datagramPacket.getPort();
            byte[] date = datagramPacket.getData();
            System.out.println(Arrays.toString(date));
            String mes = ip + ":" + new String(date) + "\n";
            //System.out.println("ip=" + id + "port=" + port);
            tp.setText(tp.getText() + mes);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            assert datagramSocket != null;
            datagramSocket.close();
        }
    }

    public void initWindow() {
        JFrame frame = new JFrame("QQ");
        frame.setContentPane(new MainWindow().jp_qq);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
        tp.setEditable(false);
    }

    public void send(String message) {
        DatagramSocket datagramSocket = null;
        try {
            datagramSocket = new DatagramSocket(receviceport);
            byte[] buf = message.getBytes();
            DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName(ip), sendport);
            datagramSocket.send(packet);
            tp.setText(tp.getText() + name + message + "\n");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            datagramSocket.close();
        }
    }

}

代码有点多,就放到github上了
github地址

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

赏烟花じ飞满天 2022-09-11 20:22:14

你把发送和接收分别用两个线程执行。这就出现了一个问题,有可能先执行接收再执行发送,也有可能在发送的过程中就执行接收了。那么出现的现象就是有时能收到数据,有时却收不到。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文