2016-11-18 6 views
2

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

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

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) 

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

ответ

0

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

Чтобы исправить это удалить UDP-сокет Инстанцированию

т.е.
sock = new DatagramSocket(8000); 

От метода получения и поставить его перед началом вашего цикла в то время.

+0

Как мой сервер может получать и отправлять данные клиенту? – IAmBlake

+0

Не знаете, что вы спрашиваете, ваш серверный код уже делает это –

+0

Но я получаю ошибку, когда компилирую ее :( – IAmBlake

1

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

Client

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(); 
    } 
} 
+0

Можете привести пример в своем ответе? Я совершенно новый здесь и где я должен внести изменения? сервера или клиента? – IAmBlake

+0

снова получаю ту же ошибку :( – IAmBlake

+0

, но сервер ничего не получает – IAmBlake