Возможно ли многопоточность на простом java-сервере, использующем протокол без установления соединения udp? - PullRequest
0 голосов
/ 22 июня 2010

Возможно ли многопоточность на простом java-сервере, использующем протокол без установления соединения udp?приведи пример !!

Ответы [ 3 ]

4 голосов
/ 22 июня 2010

Многопоточность на самом деле проще с UDP, потому что вам не нужно беспокоиться о состоянии соединения.Вот цикл прослушивания с моего сервера:

           while(true){

                    try{
                            byte[] buf = new byte[2048];

                            DatagramPacket packet = new DatagramPacket( buf, buf.length, address );

                            socket.receive( packet );
                            threadPool.execute( new Request( this, socket, packet ));

           .......

ThreadPool является ThreaPoolExecutor.Из-за кратковременного характера UDP-сессий требуется, чтобы пул потоков избегал накладных расходов при повторном создании потоков.

3 голосов
/ 22 июня 2010

Да, это возможно благодаря использованию класса DatagramChannel в java.nio. Вот учебник (Он не затрагивает многопоточность, но это все равно отдельная проблема).

1 голос
/ 22 февраля 2013

Вот один пример, попробуйте ввести свой собственный ip, чтобы вернуть жестко закодированное сообщение

package a.first;

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


public class Serv {

/**
 * @param args
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {

        Listner listner = new Listner();
        Thread thread = new Thread(listner);
        thread.start();


        String messageStr = "Hello msg1";
        int server_port = 2425;
        DatagramSocket s = new DatagramSocket();
        InetAddress local = InetAddress.getByName("172.20.88.223");
        int msg_length = messageStr.length();
        byte[] message = messageStr.getBytes();
        DatagramPacket p = new DatagramPacket(message, msg_length, local,
                server_port);
        System.out.println("about to send msg1");
        s.send(p);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            e.printStackTrace();
        }
        messageStr = "Hello msg2";
        msg_length = messageStr.length();
        message = messageStr.getBytes();
        p = new DatagramPacket(message, msg_length, local,
                server_port);
        System.out.println("about to send msg2");
        s.send(p);
}


}
   class Listner implements Runnable
    { 
            @Override
            public void run() {
        String text = null;
        while(true){
            text = null;    
        int server_port = 2425;
        byte[] message = new byte[1500];
        DatagramPacket p = new DatagramPacket(message, message.length);
        DatagramSocket s = null;
        try{
           s = new DatagramSocket(server_port);
        }catch (SocketException e) {
            e.printStackTrace();
            System.out.println("Socket excep");
        }
        try {
        s.receive(p);
       }catch (IOException e) {
            e.printStackTrace();
                System.out.println("IO EXcept");
            }
        text = new String(message, 0, p.getLength());
        System.out.println("message = "+text);
        s.close();

    }
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...