繁体   English   中英

java 中的 UDP 发送和接收问题

[英]Problems with send and recived with UDP in java

我的 java 项目与 UDP 有问题。 我有一个主项目和一个线程,我想测试一下线程是否可以将数据发送到主 class 并且主 class 接收到数据。 我有问题,有时主 class 成功接收数据,有时即使线程处于发送方法,也会停留在接收方法。 你能解释一下如何互相发送数据吗?

package TestPackage;

import static org.junit.Assert.*;

import java.net.*;

import org.junit.Before;
import org.junit.Test;

import Model.Acknowledgement;
import Model.Converter;
import Model.Network;
import Model.EventSubsystem.ElevatorEvent;


/*
 * this test is used to see if the network class works
 *
 */
public class TestNetwork {
    Thread testSendBytes;
    Thread testSendAcknowledgement;
    Thread testRecived;

    Converter converter;
    Network network;
    Network network2;

    ElevatorEvent elevatorEvent;

    /**
     * this method is used to see if the network can sent bytes though and received the right elevator event
     */
    @Test
    public void testSendByteArray() {
        testSendBytes = new Thread(new TestSendBytes(), "test send Bytes");
        testSendBytes.start();

        try {
            network = new Network(InetAddress.getLocalHost(), 0, 80);
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println(1);
        DatagramPacket packet = network.receive();
        System.out.println(4);
        byte[] bytes = packet.getData();

        elevatorEvent = (ElevatorEvent) converter.convertByteToObject(bytes);

        System.out.println(elevatorEvent.getId());

        assertEquals(elevatorEvent.getId(), 8);

    }
}

/* 
 * this thread is used to send bites back to the main class if it runs.
 */
class TestSendBytes implements Runnable {
    Converter converter;
    Network network;

    public void run()
    {
        try {
            network = new Network(InetAddress.getLocalHost(), 80, 0);
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
        ElevatorEvent elevatorEvent = new ElevatorEvent(8, 7, null, null, 69);

        byte[] elevatorEventBytes = converter.convertObjectToByte(elevatorEvent);

        /*try {
            Thread.sleep(8000);
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }*/

        network.send(elevatorEventBytes);
    }

}

package Model;

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

/**
 * This class creates a network connection for sending and receiving UDP packets.
 */
public class Network {
    private InetAddress address;
    private int sendPort;
    private int receivePort;
    private Thread send;

    /**
     * Constructor for the network class.
     * @param a InetAddress
     * @param sendPort Port number that will use when sending the packet.
     * @param receivePort port number to receive packet.
     */
    public Network(InetAddress a, int sendPort, int receivePort) {
        this.address = a;
        this.sendPort = sendPort;
        this.receivePort = receivePort;
    }

    /**
     * Receive UDP packets.
     * @return DatagramPacket.
     */
    public DatagramPacket receive() {
        DatagramPacket packet = null;
        try {
            byte msg[] = new byte[ProjectConstants.MAX_MESSAGE_LENGTH];
            DatagramSocket socket = new DatagramSocket(receivePort);
            packet = new DatagramPacket(msg, msg.length);
            System.out.println(2);
            socket.receive(packet);
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
        return packet;
    }

    /**
     * Sends a network packet with bytes of array. 
     * @param acknowledgement
     */
    public void send(byte[] acknowledgement) {
        try {
            /* it forms a packet to send back to the host sending the request  */           
            DatagramPacket packet = new DatagramPacket(acknowledgement, 
                    acknowledgement.length, 
                    address, sendPort);

            /* it creates a DatagramSocket to use to send this request */
            DatagramSocket socket = new DatagramSocket();
            System.out.println(3);
            socket.send(packet);
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    /**
     * Sends a network packet with Acknowledgement object. 
     * @param acknowledgement
     */
    public void send(Acknowledgement acknowledgement) {
        send = new Thread("send_thread") {
            public void run() {
                try {
                    DatagramPacket dgpack = new DatagramPacket(
                            acknowledgement.getMessage(), 
                            acknowledgement.getMessage().length, 
                            address, 
                            (acknowledgement.getPort() != -1) ? acknowledgement.getPort() : sendPort
                    );
                    DatagramSocket socket = new DatagramSocket();
                    System.out.println(3);
                    socket.send(dgpack);
                    socket.close();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }
        };
        send.start();
    }
}



暂无
暂无

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

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