Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/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 读取stdin并使用UDP发送,创建双向通信_Java_Sockets_Udp - Fatal编程技术网

Java 读取stdin并使用UDP发送,创建双向通信

Java 读取stdin并使用UDP发送,创建双向通信,java,sockets,udp,Java,Sockets,Udp,下面是创建套接字UDP样式的代码。我运行并编译了代码,它运行得很好。如果我使用“netcat-u”,我就能够从客户端向服务器发送消息,但反过来就不行了。所以我想要做的和我一直在尝试做的是从stdin中读取并打印它(所有这些都在第二个线程中运行)。使之成为一种双向沟通。有人知道我需要修理什么吗?提前谢谢 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; publi

下面是创建套接字UDP样式的代码。我运行并编译了代码,它运行得很好。如果我使用“netcat-u”,我就能够从客户端向服务器发送消息,但反过来就不行了。所以我想要做的和我一直在尝试做的是从stdin中读取并打印它(所有这些都在第二个线程中运行)。使之成为一种双向沟通。有人知道我需要修理什么吗?提前谢谢

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

public class NetcatUDP {

    public static void main(String[] args) throws IOException {

        int port = Integer.parseInt(args[0]);
        byte[] buffer = new byte[65536];

        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        DatagramSocket socket = new DatagramSocket(port);

        new Thread() {
            @Override
            public void run() {
                 // Read from stdin and send somehow?
            }
        }.start();

        while (true) {
            socket.receive(packet);
            System.out.println(new String(packet.getData()).trim());
        }
    }
}

UDP是一种无连接协议,这意味着您可以使用单个套接字向任何人发送消息并从任何人接收消息


对于您正在使用的简单示例,实际上可以对两个端点使用相同的程序。除了从命令行读取本地端口号外,还要读取远程IP地址和端口号。然后在线程中,使用
Console.readLine()
读取stdin,用从控制台读取的行、远程IP和远程端口构造一个
DatagramPacket
,并使用现有的
socket
发送它。

UDP是一种无连接协议,这意味着您可以通过单个套接字向任何人发送消息,也可以从任何人接收消息


对于您正在使用的简单示例,实际上可以对两个端点使用相同的程序。除了从命令行读取本地端口号外,还要读取远程IP地址和端口号。然后在线程中,使用
Console.readLine()
读取stdin,用从控制台读取的行、远程IP和远程端口构建一个
DatagramPacket
,并使用现有的
套接字发送它。

如何知道将数据包发送给谁?你想要什么,它被发送给最后一个给你发包的人?考虑当A人发送一个数据包的情况,然后人B发送一个数据包。然后发送一个数据包,消息应该发送给谁?我希望它发送给打开连接的人,假设只有一个客户端和服务器。如果客户端类型为“123”,则服务器应接收“123”,如果服务器类型为“321”,则客户端应接收“321”。UDP本质上是单工的(单向)。如果需要双工,则必须创建新的DatagramSocket等,或更改协议(TCP是全双工的)。@jbm是否可以在新线程中创建另一个DatagramSocket并向客户端发送消息?如果你知道,请随意分享“我希望它被发送给打开连接的人”,但是UDP中没有连接,这就是为什么它是单工的。您需要创建另一个UDP通道(我使用“通道”一词来避免错误假设的“连接”),或者使用另一个协议。您如何知道将数据包发送给谁?你想要什么,它被发送给最后一个给你发包的人?考虑当A人发送一个数据包的情况,然后人B发送一个数据包。然后发送一个数据包,消息应该发送给谁?我希望它发送给打开连接的人,假设只有一个客户端和服务器。如果客户端类型为“123”,则服务器应接收“123”,如果服务器类型为“321”,则客户端应接收“321”。UDP本质上是单工的(单向)。如果需要双工,则必须创建新的DatagramSocket等,或更改协议(TCP是全双工的)。@jbm是否可以在新线程中创建另一个DatagramSocket并向客户端发送消息?如果你知道,请随意分享“我希望它被发送给打开连接的人”,但是UDP中没有连接,这就是为什么它是单工的。您需要创建另一个UDP通道(我使用“通道”一词来避免错误假设的“连接”),或者使用另一个协议。@Fjodor我所描述的应该足以让您自己组装一些东西。如果您有一个特定的问题,请用您目前掌握的代码更新您的问题。@Fjodor我所描述的应该足以让您自己整理一些东西。如果您有一个特定的问题,请使用您目前掌握的代码更新您的问题。