Сервер-Клиент в UDP

Моя программа простого клиент-сервера Datagram выдает ошибку. Клиент получает информацию с сервера, а сервер также получает информацию от клиента.

Вот мой сервер:

package udp;

import java.net.*;

public class DatagramServer implements Runnable {

DatagramPacket pack;
DatagramSocket sock;

DatagramServer() {
    new Thread(this).start();
}

public void run() {
    try {
        while (true) {
            recieve();
            send();
        }
    } catch (Exception e) {
        System.out.println(e);
    }
}

public void send() throws Exception {
    byte data[] = "This is a \n datagram packet".getBytes();
    InetAddress add = InetAddress.getByName("localhost");
    pack = new DatagramPacket(data, data.length, add, 8000);
    sock = new DatagramSocket();
    sock.send(pack);
    sock.close();
}

public void recieve() throws Exception {

    byte[] buffer = new byte[65536];
    DatagramPacket incoming = new DatagramPacket(buffer, buffer.length);
    sock = new DatagramSocket(8000);
    sock.receive(incoming);
    byte[] data = incoming.getData();
    String s = new String(data, 0, incoming.getLength());
}

public static void main(String[] args) {
    new DatagramServer();
}
}

И вот мой клиент:

package udp;

import java.net.*;

public class DatagramClient {

DatagramPacket pack;
DatagramSocket sock;

DatagramClient() {
    Thread t1 = new Thread() {
        public void run() {
            while (true) {
                try {
                    receive();
                    Thread.sleep(5000);
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        }
    };
    t1.start();
    Thread t2 = new Thread() {
        public void run() {
            while (true) {
                try {
                    send();
                    Thread.sleep(5000);
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        }
    };
    t2.start();
}

public void receive() throws Exception {
    byte data[] = new byte[1000];
    pack = new DatagramPacket(data, data.length);
    sock = new DatagramSocket(8000);
    sock.receive(pack);
    System.out.println("Data::" + new String(pack.getData(), "UTF-8"));
    System.out.println("Port::" + pack.getPort());
    sock.close();
}

public void send() throws Exception {

    String s = "KOLI SDF DFEF XFFFSS";
    byte[] b = new byte[1000];
    b = s.getBytes();
    DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress.getByName("localhost"), 8000);
    sock= new DatagramSocket(8000);
    sock.send(dp);
}

public static void main(String[] args) {
    new DatagramClient();
}
}

Я получаю ошибки, такие как:

java.net.BindException: Address already in use: Cannot bind
java.net.BindException: Address already in use: Cannot bind
java.net.BindException: Address already in use: Cannot bind
java.net.BindException: Address already in use: Cannot bindBUILD STOPPED  (total time: 4 seconds)

Что я должен делать?

2 ответа

Решение

Проблема в том, что ваш серверный код пытается связываться с портом 8000 каждый раз, когда вызывается метод receive (). И получение вызывается повторно из цикла while(true). Поэтому он пытается снова и снова связываться с одним и тем же портом.

Чтобы исправить это, удалите экземпляр UDP-сокета, т.е.

sock = new DatagramSocket(8000);

Из метода receive и поместите его перед началом цикла while.

У вашего клиента и сервера есть некоторые проблемы, такие как открытие одного и того же порта 8000 в разных потоках, поэтому я исправил их в следующем коде.

клиент

package udp;

import java.net.*;

public class DatagramClient {

    DatagramPacket pack;
    DatagramSocket sock;

    DatagramClient() {
        Thread t1 = new Thread() {
            public void run() {
                while (true) {
                    try {
                        receive();
                        Thread.sleep(5000);
                    } catch (Exception e) {
                        System.out.println(e);
                    }
                }
            }
        };
        t1.start();
    }

    public void receive() throws Exception {
        byte data[] = new byte[1000];
        pack = new DatagramPacket(data, data.length);
        sock = new DatagramSocket(8000);
        sock.receive(pack);
        System.out.println("Data::" + new String(pack.getData(), "UTF-8"));
        System.out.println("Port::" + pack.getPort());
        sock.close();
    }

    public void send() throws Exception {

        String s = "KOLI SDF DFEF XFFFSS";
        byte[] b = new byte[1000];
        b = s.getBytes();
        DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress.getByName("localhost"), 8000);
        sock= new DatagramSocket(8000);
        sock.send(dp);
    }

    public static void main(String[] args) {
        new DatagramClient();
    }
}

сервер

package udp;

import java.net.*;

public class DatagramServer implements Runnable {

    DatagramPacket pack;
    DatagramSocket sock;

    DatagramServer() {
        new Thread(this).start();
    }

    public void run() {
        try {
            while (true) {
                //recieve();
                send();
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    public void send() throws Exception {
        byte data[] = "This is a \n datagram packet".getBytes();
        InetAddress add = InetAddress.getByName("localhost");
        pack = new DatagramPacket(data, data.length, add, 8000);
        sock = new DatagramSocket();
        sock.send(pack);
        sock.close();
    }

    public void recieve() throws Exception {

        byte[] buffer = new byte[65536];
        DatagramPacket incoming = new DatagramPacket(buffer, buffer.length);
        sock = new DatagramSocket(8000);
        sock.receive(incoming);
        byte[] data = incoming.getData();
        String s = new String(data, 0, incoming.getLength());
    }

    public static void main(String[] args) {
        new DatagramServer();
    }
}
Другие вопросы по тегам