gpt4 book ai didi

Java UDP 数据包未从客户端程序到达服务器程序

转载 作者:行者123 更新时间:2023-12-01 14:19:42 24 4
gpt4 key购买 nike

我一直在尝试学习java中的网络,并从使用简单的GUI制作一个简单的客户端/服务器程序开始。服务器只有一个 JTextArea,客户端有一个 JTextField、JTextArea 和一个 JButton。它的工作方式是客户端用户在 JTextField 中键入消息并单击 JButton(发送)。这将调用 sendData 方法,该方法获取客户端键入的消息,将其放入 DatagramPacket 中,并将数据包发送到预定义端口上的服务器。服务器在启动时创建一个连续循环的线程,允许它使用 DatagramSocket.recieve(DatagramPacket) 方法被动监听数据包。如果收到数据包,它会使用数据包中的数据更新 gui 的 JTextArea。但是,数据包似乎没有到达服务器。我已经在 LAN 网络上对此进行了测试,它可以正常工作。然而,当通过互联网使用时,数据包似乎会丢失。我曾与两个不同的人尝试过,他们的端口已被转发,并且确信它们已被转发。客户端和服务器都由 3 个简单的类组成。任何帮助将不胜感激。很抱歉冗长的描述和代码转储。注意:我之所以使用 UDP,只是因为我想学习它,而且我知道 TCP 更适合聊天之类的事情。

客户端的客户端类:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;


public class Client {

DatagramSocket socket;
Panel panel;

public Client(Panel panel) {
this.panel = panel;
try {
socket = new DatagramSocket();
} catch (SocketException e) {
e.printStackTrace();
panel.textArea.setText("Socket could not be created.");
}

}

public void sendData(byte[] data, InetAddress ipAddress){
DatagramPacket packet = new DatagramPacket(data, data.length, ipAddress, 27015);
try {
socket.send(packet);
panel.textArea.setText("Client: Package being sent to server...");
} catch (IOException e) {
e.printStackTrace();
panel.textArea.setText("Package could not be sent");
}

}

}

客户端的面板类:

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.InetAddress;
import java.net.UnknownHostException;

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



public class Panel extends JPanel implements ActionListener {

JButton send;
JTextField textField;
JTextField textArea;
Client client;
InetAddress ipAddress;

public Panel(){


this.setVisible(true);

send = new JButton("Send");
send.addActionListener(this);
send.setVisible(true);

textField = new JTextField();
textField.setVisible(true);
Dimension dim = new Dimension(300,20);
textField.setPreferredSize(dim);

textArea = new JTextField();
Dimension dim2 = new Dimension(300,100);
textArea.setPreferredSize(dim2);

this.add(textField);
this.add(send);
this.add(textArea, FlowLayout.LEFT);

client = new Client(this);



}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == send){
System.out.println("Send was pressed");

String message = textField.getText();
try {
ipAddress = InetAddress.getByName("localhost");
} catch (UnknownHostException e1) {
e1.printStackTrace();
textArea.setText("Hostname could not be resolved");
}
client.sendData(message.getBytes(), ipAddress);
textArea.setText("Client: " + message);
}

}



}

服务器的ServerThread类:

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.JPanel;


public class ServerThread extends Thread{

private DatagramSocket socket;
Panel panel;

public ServerThread(Panel panel) {
this.panel = panel;
try {
socket = new DatagramSocket(27015);
panel.setTextArea("The server has begun listening on port 3659...");
} catch (SocketException e) {
e.printStackTrace();
panel.setTextArea("Server cant open socket and listen on port 3659");
}
}

public void run(){
while(true){
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);

try {
socket.receive(packet); // waits for packet to arrive
panel.setTextArea("Server: A package was recieved from the Client...");
} catch (IOException e) {
e.printStackTrace();
panel.setTextArea("Socket cant recieve packets");
}

String message = new String(packet.getData());
panel.setTextArea("Client: " + message);

}

}

}

注意:对于服务器和客户端,主类只需创建一个新的 Jframe 和面板类的新实例,并将其设置为其内容 Pane 。我没有包含服务器的面板类,因为它不包含任何重要的代码。

再次感谢。

最佳答案

听起来网络安全配置阻止您接收 UDP 数据包。您需要配置网络,使其在指定端口上接受 UDP 数据包。此外,您还必须将防火墙配置为接受指定端口上的 UDP 数据包。

关于Java UDP 数据包未从客户端程序到达服务器程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17721620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com