有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我一直在尝试用java学习网络,并开始用一个简单的GUI制作一个简单的客户机/服务器程序。服务器只有一个JTextArea,客户端有一个JTextField、JTextArea和一个JButton。它的工作方式是,客户端的用户在JTextField中键入消息,然后单击JButton(发送)。这将调用sendData方法,该方法接收客户端键入的消息,将其放入DatagramPacket中,并将数据包发送到预定义端口上的服务器。服务器在启动时创建一个线程,该线程持续循环,允许它使用DatagramSocket被动地侦听数据包。recieve(DatagramPacket)方法。如果收到数据包,它将使用数据包中的数据更新gui的JTextArea。但是,数据包似乎没有到达服务器。我已经在局域网上进行了测试,它正在工作。然而,当在互联网上使用时,数据包似乎丢失了。我试过与两个不同的人谁有他们的港口转发,并确定他们是转发。客户端和服务器都由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);

    }

}

}

注意:对于服务器和客户端,main类只是创建一个新的Jframe和panel类的一个新实例,并将其设置为其内容窗格。我没有包括服务器的panel类,因为它没有包含任何重要的代码

再次感谢


共 (1) 个答案

  1. # 1 楼答案

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