用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位址
你把發送和接收分別用兩個執行緒執行。這就出現了一個問題,有可能先執行接收再執行發送,也有可能在發送的過程中就執行接收了。那麼出現的現象就是有時能收到數據,有時卻收不到。