用Java 写了一个简单的聊天软件 使用UDP,但是总是收不到消息?
用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你把发送和接收分别用两个线程执行。这就出现了一个问题,有可能先执行接收再执行发送,也有可能在发送的过程中就执行接收了。那么出现的现象就是有时能收到数据,有时却收不到。