Newer
Older
ServerTester / src / main / java / info / istlab / ServerTester / UDPServer.java
package info.istlab.ServerTester;

import java.net.BindException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.Hashtable;

import javax.swing.JOptionPane;

public class UDPServer implements Runnable {
    Thread thread;
    DatagramSocket socket = null;
    public int port;

    // 受信したデータを IP アドレスをキーにして保存
    Hashtable<String, String> receivedData = new Hashtable<String, String>();

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

    public UDPServer() {
        this(54320);
    }

    public UDPServer(int _port) {
        port = _port;
        try {
            // サーバーソケットを指定されたポートで作成
            socket = new DatagramSocket(port);

            System.out.println("[UDP] 近隣ホストのサーバ情報を集めるUDPサーバをポート" + port + "で起動しました。");
            System.out.println(getClass().getName() + " [0.0.0.0:" + port + "] started.");

        } catch (BindException bex) {
            JOptionPane.showMessageDialog(Host.mainhost,
                    "UDPサーバ起動時に、サーバソケットのバインドに失敗しました。\n\nポート " + port + " は使用されています。\n既存のサービスを停止するか、ポート番号を変更してください。",
                    "エラー", JOptionPane.ERROR_MESSAGE);
        } catch (Exception e) {
            e.printStackTrace();
        }
        start();
    }

    public void start() {
        if (thread == null) {
            thread = new Thread(this);
            thread.start();
        }
    }

    public void stop() {
        socket.close();
    }

    public void run() {
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        while (thread != null) {
            try {
                // データグラムパケットを受信
                socket.receive(packet);

                System.out.println(
                        "[UDP] " + packet.getAddress().getHostAddress() + ":" + packet.getPort() + " から以下のデータを受信しました。");

                // 受信したデータを文字列に変換
                String received = new String(packet.getData(), 0, packet.getLength());
                receivedData.put(packet.getAddress().getHostAddress(), received);
                System.out.println(received);

                // 返信メッセージを作成
                // String response = "サーバーからの応答: " + received;
                // byte[] responseData = response.getBytes();
                // // 返信データを送信
                // DatagramPacket responsePacket = new DatagramPacket(
                // responseData, responseData.length,
                // packet.getAddress(), packet.getPort());
                // socket.send(responsePacket);
            } catch(SocketException sx) {
                thread = null;
            } catch (Exception e) {
                e.printStackTrace();
                thread = null;
            } finally {
                if (socket != null) {
                    socket.close();
                }
            }
        }
        if (socket != null && !socket.isClosed()) {
            socket.close();
        }
    }

    
}