【问题标题】:Java UDP packets not reaching Server program from Client programJava UDP 数据包未从客户端程序到达服务器程序
【发布时间】:2013-07-18 11:00:38
【问题描述】:

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

Client的Client类:

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);
    }

}



}

Server的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 和一个面板类的新实例,并将其设置为它的内容窗格。我没有包含服务器的面板类,因为它不包含任何重要的代码。

再次感谢。

【问题讨论】:

    标签: java swing concurrency udp event-dispatch-thread


    【解决方案1】:

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

    【讨论】:

    • 您好,网络已配置(端口已转发)。但是我忘记了防火墙。我将配置防火墙并重试。谢谢
    • 您好,我已经配置了防火墙和网络,但似乎仍然没有数据包到达服务器。有什么想法吗?
    • 其他人有什么想法吗?你能帮忙的话,我会很高兴。谢谢
    • 感谢该链接。原来是我的朋友网络(运行服务器)没有正确配置,不允许数据包通过,并且在正确配置后,一直工作得很好。然而,对我来说,下一步是找到一种方法来制作一个不需要端口转发或任何类型的网络配置的聊天程序。巧合的是,当我意识到其他人已经回复了该主题时,我正在研究该特定主题,然后我看到了您的链接:D。再次感谢。
    • 不客气 :) 事实上,我一直想知道他们如何在不需要端口转发的情况下进行 p2p。一年或更久以前,我在寻找关于同一件事的文章……没有端口转发的 UDP/TCP,但找不到任何有用的东西。现在你的话题来了,这对我来说是一个很好的机会找到这么好的文章。实际上,我要感谢您帮助我完成下一个项目;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多