Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中用TCP模拟UDP?_Java - Fatal编程技术网

如何在java中用TCP模拟UDP?

如何在java中用TCP模拟UDP?,java,Java,我希望能够有一个TCP客户端发送基本字符串通过UDP广播 我似乎找不到任何关于如何将UDP数据报写入TCP或通过TCP发送被截获并转换为UDP的消息的资源 发件人: import java.io.*; import java.net.*; public class MulticastSender { public static void main(String[] args) { DatagramSocket socket = null; DatagramPacket out

我希望能够有一个TCP客户端发送基本字符串通过UDP广播

我似乎找不到任何关于如何将UDP数据报写入TCP或通过TCP发送被截获并转换为UDP的消息的资源

发件人:

import java.io.*;
import java.net.*;
public class MulticastSender {
  public static void main(String[] args) {
    DatagramSocket socket = null;
    DatagramPacket outPacket = null;
    byte[] outBuf;
    final int PORT = 8888;

    try {
      socket = new DatagramSocket();
      long counter = 0;
      String msg;

      while (true) {
        msg = "This is multicast! " + counter;
        counter++;
        outBuf = msg.getBytes();

        //Send to multicast IP address and port
        InetAddress address = InetAddress.getByName("224.2.2.3");
        outPacket = new DatagramPacket(outBuf, outBuf.length, address, PORT);

        socket.send(outPacket);

        System.out.println("Server sends : " + msg);
        try {
          Thread.sleep(500);
        } catch (InterruptedException ie) {
        }
      }
    } catch (IOException ioe) {
      System.out.println(ioe);
    }
  }
}
接收人:

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

public class MulticastReceiver {
  public static void main(String[] args) {
    MulticastSocket socket = null;
    DatagramPacket inPacket = null;
    byte[] inBuf = new byte[256];
    try {
      //Prepare to join multicast group
      socket = new MulticastSocket(8888);
      InetAddress address = InetAddress.getByName("224.2.2.3");
      socket.joinGroup(address);

      while (true) {
        inPacket = new DatagramPacket(inBuf, inBuf.length);
        socket.receive(inPacket);
        String msg = new String(inBuf, 0, inPacket.getLength());
        System.out.println("From " + inPacket.getAddress() + " Msg : " + msg);
      }
    } catch (IOException ioe) {
      System.out.println(ioe);
    }
  }
}

TCP客户端是否有可能以某种方式写入服务器上打开的TCP套接字,并将要通过侦听UDP发送的内容放入UDP客户端?(这样TCP客户端可以向UDP发送消息,UDP消息可以通过TCP连接收听和发送)

我不确定是否理解了这个问题

如果我错了,请纠正我:

A-客户端正在向名为B的TCP服务器套接字发送TCP数据包

B(TCP服务器套接字)获取数据包,并且必须通过UDP将它们发送到客户端套接字调用C?(在本例中,您所称的客户机套接字实际上是一个服务器套接字。)

如果这就是你想要做的一切,那么答案是微不足道的

在名为B的服务器套接字上获取TCP消息,从中获取内容,将内容放在UDP数据报上,并通过UDP将其发送到C


我唯一的建议是:在服务器B上接收TCP消息后,实例化一个新线程来处理接收到的消息(获取内容,然后将其放入UDP数据包),并将其发送到客户端C。

我将尝试非常直接地回答标题中提出的问题:“如何在java中用TCP模拟UDP?”

简言之,你不能。TCP保证了可靠的传输,而UDP只是简单的发射和遗忘。因此,您可以始终将UDP数据报发送到网络中,而不知道或不注意接收器是否存在并正在侦听

另一方面,TCP在发送任何内容之前需要连接到对等方。因此,当您在无人监听的情况下尝试发送时,“使用TCP模拟UDP”的任何尝试都必须失败


显然,编写一个监听UDP并通过TCP将接收到的任何数据重新发送给对等方的程序并不困难;或者类似地,一个程序侦听TCP并重新发送它通过UDP获得的内容。但这不是“模拟”,只是使用不同的协议重新发送。

我不理解您遇到的问题。您能够通过TCP发送消息吗?然后,您是否能够通过TCP接收这些消息?您能够通过UDP发送消息吗?您能够通过UDP接收消息吗?只要您了解TCP是一个有保证的顺序和可靠性的流,UDP是基于消息的,而没有保证顺序和可靠性,如果您可以通过TCP和UDP进行读写,那么您的问题应该很容易解决。您想用它实现什么?看看这个问题:是的,这正是我试图实现的目标,尽管看起来没有人做过类似的事情。Setsuna ammoQ已经回答了你的问题。尝试混合使用这两种协议非常容易,但这并不是你所说的模拟。因此,你想将“msg”发送到另一个名为C的服务器,但这次使用的是TCP。为了实现这一点,您只需创建一个实现可运行(或扩展线程)的java套接字客户机类。这个类就是您的TCP客户机。您将把刚刚收到的“msg”传递给这个类的实例。传递消息后,只需调用线程的run()方法,此线程将处理通过TCP发送消息的问题。您能提供一个示例吗?