Java的UDP服务器(Java UDP server)

2019-08-17 22:44发布

我是新来的Java编程,我试图创建一个UDP服务器。 当我编译代码它说,它无法侦听端口4722,我想知道这是为什么。 下面是代码。 我会为任何建议表示感谢。

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


public class Server 
{
public static void main(String[] args) throws IOException 
{
    DatagramSocket serverSocket = new DatagramSocket(4722);
    Socket clientSocket = null;
    byte[] receiveData = new byte[1024];
    byte[] sendData = new byte [1024];      

    boolean command = true;
        try
        {
            serverSocket = new DatagramSocket(4722);
            DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);
            System.out.println("Waiting for client...");


        } 


        catch (IOException e) 
        {
            System.err.println("Could not listen on port: 4722.");
            System.exit(1);

        }
        DatagramPacket packet = new DatagramPacket (sendData,sendData.length,4722);
        serverSocket.send(packet);



        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        String inputLine, outputLine;
        mathematicalProtocol bbm = new mathematicalProtocol();

        outputLine = bbm.processInput(null);
        out.println(outputLine);

        while ((inputLine = in.readLine()) != null) 
        {
            if(inputLine.equals("Bye."))
            break;
            outputLine = bbm.processInput(inputLine);
            out.println(outputLine);
            if (outputLine.equals("Bye."))

            break;
        }

        out.close();
        in.close();
        clientSocket.close();
        serverSocket.close();
}
}

Answer 1:

要初始化serverSocket然后又做了新DatagramSocket再次在同一端口上(你不能这样做,因为它已经绑定在第一DatagramSocket )。 即删除以下行:

        serverSocket = new DatagramSocket(4722);


Answer 2:

下面是客户机/服务器的UDP通信的一个完整的例子。

服务器从文件中读取数据,并每行发送给客户端。

import java.io.BufferedReader; 
import java.io.FileReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/**
 * @author nono
 *
 */

public class UDPFileSender {

static class Client implements Runnable {

    // Reception socket
    private DatagramSocket socket;
    // UDP packet to receive data into
    private DatagramPacket packet;
    // Flag for initialisation
    private boolean failedInit = true;

    /**
     * Client constructor.
     * @param receptionPort
     * @param packetMaxLenght
     */
    public Client(int receptionPort, int packetMaxLenght) {
        try {
            // Create the socket using the reception port
            this.socket = new DatagramSocket(receptionPort);
            // Init the packet
            this.packet = new DatagramPacket(new byte[packetMaxLenght],packetMaxLenght);
            this.failedInit = false;
        } catch (SocketException e) {
            //Port already used or other error
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        if(failedInit){
            return;
        }
        // Loop undefinitly
        while(true){
            try {

                System.out.println("Waiting for packet...");

                // Wait for packet
                socket.receive(packet);

                // Assuming you are receiving string
                String msg = new String(packet.getData());
                System.out.println("Received : " + msg);

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

public static void main(String[] args) {

    try {

        int port = 4722;

        //Start a client that can listen
        new Thread(new Client(port,1024)).start();

        // Creaete a reader
        BufferedReader reader = new BufferedReader(new FileReader("File.txt"));

        //Create a socket
        DatagramSocket socket = new DatagramSocket();

        // Create a packet
        byte[] data = new byte[1024]; // Max length
        DatagramPacket packet = new DatagramPacket(data, data.length);

        // Set the destination host and port 
        packet.setAddress(InetAddress.getByName("localhost"));
        packet.setPort(port);

        String line = null;
        while((line = reader.readLine()) != null){
            //Set the data
            packet.setData(line.getBytes());

            //Send the packet using the socket
            System.out.println("Sending : " + line);
            socket.send(packet);
            Thread.sleep(200);
        }

        //Close socket and file
        reader.close();
        socket.close();

    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }
}

}

如果您的文件包含:

Hello
World

您应该看到:

Waiting for packet...
Sending : Hello
Received : HelloWaiting for packet...
Sending : World
Received : World
Waiting for packet...


文章来源: Java UDP server
标签: java udp