繁体   English   中英

Java程序与DatagramSocket之间的通信

[英]Communication between Java programs with DatagramSocket

我正在尝试交流两个Java程序,对此没有问题。 程序A发送带有单词“ token”的消息,程序B收到该消息并打印。 我的问题是我想在消息长度之前发送给程序B,以创建具有正确长度的数组,但是我不知道该怎么做。

public class ProgramA {
public static void main(String[] args) {
    try {
        DatagramSocket datagramSocket = new DatagramSocket();
        String message = "token";
        InetAddress addr = InetAddress.getByName("localhost");
        DatagramPacket datagram = new DatagramPacket(message.getBytes(),message.getBytes().length, addr, 5556);
        datagramSocket.send(datagram);
        datagramSocket.close();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

public class ProgramB {
public static void main(String[] args) {
    try {
        InetSocketAddress addr = new InetSocketAddress("localhost", 5556);
        DatagramSocket datagramSocket = new DatagramSocket(addr);
        byte[] message = new byte[5];
        DatagramPacket datagram = new DatagramPacket(message, message.length);
        datagramSocket.receive(datagram);
        datagramSocket.close();
        for(int i = 0; i < message.length; i++) {
            System.out.print((char)message[i]);
        }
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}

如果您知道消息的长度最大为X个字节,则可以使用以下内容:

package experiment;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class ProgramA {
    public static void main(String[] args) {
        try {
            System.out.println("Started");
            DatagramSocket datagramSocket = new DatagramSocket();
            String message = "tokenasdfasdfasdfasdf";
            InetAddress addr = InetAddress.getByName("localhost");
            DatagramPacket datagramLength = new DatagramPacket(new byte[]{(byte)message.length()}, 1, addr, 5556);
            DatagramPacket datagram = new DatagramPacket(message.getBytes(),message.getBytes().length, addr, 5556);
            datagramSocket.send(datagramLength);
            datagramSocket.send(datagram);
            datagramSocket.close();
            System.out.println("Done");
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

package experiment;

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

public class ProgramB {
    public static void main(String[] args) {
        try {
            InetSocketAddress addr = new InetSocketAddress("localhost",     5556);
            DatagramSocket datagramSocket = new DatagramSocket(addr);
            byte[] messageLength = new byte[1];
            DatagramPacket datagramLength = new DatagramPacket(messageLength, 1);
            datagramSocket.receive(datagramLength);
            byte[] message = new byte[(int)messageLength[0]];
            DatagramPacket datagram = new DatagramPacket(message, message.length);
            datagramSocket.receive(datagram);
            datagramSocket.close();
            for(int i = 0; i < message.length; i++) {
                System.out.print((char)message[i]);
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

假设邮件的长度不超过127,则可以正常工作; 否则,带有消息长度的datagramPacket必须包含一个以上的字节

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM