0

複数のクライアントに対して UDP を使用して Java でチャット アプリケーションを実装しようとしています。サーバー側で入力を受け入れるためにスレッドを使用し、入力を処理するために別のスレッドを使用しました。私のコードは次のとおりです。

サーバ側:

 import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.concurrent.LinkedBlockingQueue;

public class ChatServer
{
    static DatagramSocket socket;
    static DatagramPacket packet;
    static ArrayList<InetAddress> arrayList;
    static LinkedBlockingQueue<byte[]> messages;

    public static void main(String[] args) throws IOException 
    {

        arrayList = new ArrayList<InetAddress>();

        messages = new LinkedBlockingQueue<byte[]>();

        byte[] b = new byte[500];

        System.out.println("Server initialized..");


        socket = new DatagramSocket(Integer.parseInt(args[0]));
        packet = new DatagramPacket(b, b.length);

        Thread acceptorThread = new Thread()
        {
            public void run()
            {
                while(true)
                {
                    try 
                    {
                        socket.receive(packet);

                        System.out.println("acceptor");
                        if(arrayList.add(packet.getAddress()))
                            System.out.println("listtrue");


                        if(messages.add(packet.getData()))
                        System.out.println("queuetrue");;
                    } 
                    catch (IOException e) 
                    {
                        e.printStackTrace();
                    }

                }
            }
        };


        acceptorThread.start();

        Thread messageHandler = new Thread()
        {
            public void run()
            {

                System.out.println("handler");
                while(true)
                {
                    if(messages.poll() != null)

                    {
                        byte []b = "soham".getBytes();
                        sendAll(b);
                    }

                }
            }
        };


        messageHandler.start();

    }   




    public static void sendAll(byte[] b)
    {
        for(InetAddress address : arrayList)
        {
            DatagramPacket packet = new DatagramPacket(b, b.length, address, 4445);
            try 
            {
                socket.send(packet);
            } 
            catch (IOException e) 
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            finally
            {
                socket.close();
            }
        }
    }



}

クライアント側は次のとおりです。

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class ChatClient {
    public static void main(String[] args) throws IOException 
    {

        while(true)
        {
        //get input
        System.out.println("Message:");
        Scanner sc = new Scanner(System.in);
        String message = sc.next();

            // get a datagram socket
        DatagramSocket socket = new DatagramSocket();

            // send request
        byte[] buf = new byte[256];
        buf = message.getBytes();

        InetAddress address = InetAddress.getLocalHost();
        DatagramPacket packet = new DatagramPacket(buf, buf.length, address, Integer.parseInt(args[0]));
        socket.send(packet);

            // get response
        packet = new DatagramPacket(buf, buf.length);
        socket.receive(packet);

        // display response
        String received = new String(packet.getData(), 0, packet.getLength());
        System.out.println(packet.getSocketAddress()+" " + received);

        }
    }

}

実行後のスタックトレースは私に与えます:

java.net.SocketException: Socket closed
    at java.net.DualStackPlainDatagramSocketImpl.checkAndReturnNativeFD(Unknown Source)
    at java.net.DualStackPlainDatagramSocketImpl.receive0(Unknown Source)
    at java.net.AbstractPlainDatagramSocketImpl.receive(Unknown Source)
    at java.net.DatagramSocket.receive(Unknown Source)
    at snippet.ChatServer$1.run(ChatServer.java:40)

問題を特定できません。どんな助けでも大歓迎です、乾杯。

4

2 に答える 2

0

あなたのsendAll方法は、(最初​​の)パケットが送信されるたびにソケットを閉じています。

于 2013-09-14T23:57:04.567 に答える
0

finallyブロックの意味を誤解しています。現在、sendAll の各反復で実行されています。最後のクライアントに対してのみ行う必要があるときに、すべてのクライアントのソケットを閉じています。

于 2013-09-14T23:58:56.173 に答える