需要帮助java中的udp套接字编程

时间:2011-04-24 04:29:45

标签: java udp client-server

嘿伙计们我正在开展一个项目,我需要在实际的互联网上广播UDP数据包,并在客户端接收它们。目前我正在使用多播套接字在本地局域网上广播数据包。我遇到过这个名为jstunt的项目,用于UDP数据报的NAT遍历,但无法找到任何相关文档,也没有实现。我熟悉Nat Traversal的概念,UDP打孔但面临与上述相同的问题,没有相关的文档和实现。所以任何人都可以请求帮助,并建议其他一些技术来实现这一目标。

3 个答案:

答案 0 :(得分:1)

正如另一张海报所提到的,你无法真正“免费”向互联网“广播”一个数据包。如果可能的话,网络很容易成为DOS,并且会产生令人难以置信的拥塞。即使在受控网络中,广播通常也会受到严格控制,以至于它们不会失控。也就是说,也许你真的不需要“广播”这个数据包。

如果您需要在互联网上创建UDP“隧道”,例如P2P软件如何工作,则可以完成。诀窍通常是NAT。你提到你已经熟悉UDP打孔,但无法弄清楚如何使它工作。以下是一些可用于此的Java库:

http://www.masquerade.cz/en/nat-tunel-metodou-udp-hole-punching-v-jazyce-java/ http://ulno.net/projects/jpunch/ http://samy.pl/pwnat/

同时查看UPNP:http://en.wikipedia.org/wiki/Universal_Plug_and_Play

STUNT库:http://nutss.gforge.cis.cornell.edu/stunt.php

答案 1 :(得分:0)

您的ISP和您的客户不太可能支持UDP广播,更不用说互联网骨干网可能允许或不允许的内容。您需要首先调查这不是一个编程问题,这是一个可行性问题。

答案 2 :(得分:0)

使用UDP SOCKET实现ITS基本日间服务器实现帮助

客户端

import java.io.*;
import java.net.*;

public class DayTime_Client_Udp 
{
    public static void main (String[] args) throws IOException 
    {
            String hostname= "localhost";
            int port=13;

        if ((args.length == 1))
{
                hostname=args[0];
            }
else if ((args.length==2))
        {
                hostname=args[0];
                port=Integer.parseInt(args[1]);
            }

        InetAddress host = InetAddress.getByName(hostname);
            DatagramSocket socket = new DatagramSocket ();

            DatagramPacket packet=new DatagramPacket (new byte[100], 0,host, port);


            socket.send (packet);

            packet.setLength(100);
            socket.receive (packet);
            socket.close ();

        byte[] data = packet.getData ();
            String time=new String(data);  // convert byte array data into string
        System.out.println(time);
    }
}

SERVER

import java.io.*;
import java.net.*;

public class DayTime_Server_Udp
{
    public static final int DEFAULT_PORT = 3001;

    public static void main (String[] args) throws IOException 
    {
            if (args.length > 1)
{
            throw new IllegalArgumentException ("Syntax: DaytimeServer [<port>]");
            }

DatagramSocket socket = new DatagramSocket(args.length == 0 ?
DEFAULT_PORT : Integer.parseInt (args[0]));

        DatagramPacket packet = new DatagramPacket (new byte[1], 1);

        while (true) 
        {
                socket.receive (packet);
                System.out.println("Received from: " + packet.getAddress () + ":" +
 packet.getPort ());
                byte[] outBuffer = new java.util.Date ().toString ().getBytes ();
                packet.setData (outBuffer);
                packet.setLength (outBuffer.length);
                socket.send (packet);
            }
    }
}

如果需要更多帮助而不是评论,我还有UDP BASD的其他程序,因此它有帮助