0

このプログラムを使用して他の人とメッセージを送受信できる UDP Java チャット プログラムを作成したいと考えていました。ソケットのプログラミングは自分で(Google検索などで)把握したので、すべての部分が完全には理解できていません。基本的な考え方は、チャットしたいランダムな IP を文字列として読み取り、それを IP に変換し、ポート A からメッセージを送信するためのスレッドとポート B でメッセージを受信するための 2 つのスレッドを開始することです (スレッドは、同時にメッセージを送受信できます)。すべてのスレッドには独自のクラスがあります。ここまでは順調ですね。これで、両方のクラスにメソッド run があり、どちらも大きな try-catch ブロックにあります。2 つの catch ブロックで、最初に "Test123"、次に "Test456" といういくつかのエラー メッセージを追加して、いつ何が起こるかを理解できるようにしました。コードをコンパイルすると、IP を入力できます (テストのために localhost を試しました)。しかし、メッセージを入力すると、「チャット パートナーが送信しました:」というメッセージが表示されるはずですが、代わりに何も表示されません。現在、両方のスレッドが無限ループに入っているため、(Ctrl+C を押して (コマンドで .class を実行して)) プログラムを強制終了すると、プログラムが終了する前に「Test123」というエラー メッセージが表示されます。私の質問は次のとおりです。メッセージが表示されないのはなぜですか。また、プログラムを強制終了すると、プログラムが「Test123」をスローするのはなぜですか? エラーはどこにありますか? 助けてくれてありがとう。コードは次のとおりです。そのため、プログラムを強制終了すると (Ctrl+C を押して (コマンドで .class を実行します))、プログラムが終了する前にエラー メッセージ "Test123" が表示されます。私の質問は次のとおりです。メッセージが表示されないのはなぜですか。また、プログラムを強制終了すると、プログラムが「Test123」をスローするのはなぜですか? エラーはどこにありますか? 助けてくれてありがとう。コードは次のとおりです。そのため、プログラムを強制終了すると (Ctrl+C を押して (コマンドで .class を実行します))、プログラムが終了する前にエラー メッセージ "Test123" が表示されます。私の質問は次のとおりです。メッセージが表示されないのはなぜですか。また、プログラムを強制終了すると、プログラムが「Test123」をスローするのはなぜですか? エラーはどこにありますか? 助けてくれてありがとう。コードは次のとおりです。

import java.net.*;
import java.util.Scanner;

public class chat {
    static InetAddress IP;
    static int sPort=11111;
    static int rPort=11112;
    public static void main(String[] args) throws Exception{
        System.out.println("Zu welcher IP soll verbunden werden?");//"which IP do you want to connect with?"
        Scanner sc = new Scanner(System.in);
        String IPraw=sc.next(); //type in the IP address as String
        IP=InetAddress.getByName(IPraw); //converting the String into real IP address
        Thread sender = new sender();
        sender.start(); //start the sending thread
        Thread receiver = new receiver();
        receiver.start(); //start the receiving thread
    }
}
class sender extends Thread{
    public void run(){
        byte[] sendData = new byte[1024];
        Scanner scantext = new Scanner(System.in);
        try{
            DatagramSocket Socket = new DatagramSocket();
            while(true){
                String TextSend = scantext.next();
                sendData = TextSend.getBytes();
                DatagramPacket out = new DatagramPacket(sendData, sendData.length, chat.IP, chat.rPort);
                Socket.send(out);
            }
        }
        catch(Exception e){
        System.out.println("Test123");
        }
    }
}

class receiver extends Thread{
    public void run(){
        byte[] receiveData = new byte[1024];
        try{
            DatagramSocket socket = new DatagramSocket();
            while(true){
                DatagramPacket in = new DatagramPacket(receiveData, receiveData.length, chat.IP, chat.sPort);
                socket.receive(in);
                String message = new String(in.getData());
                System.out.println("Chatpartner sagt: " + message);//"partner said <message>"           
            }
        }
        catch(Exception e){
        System.out.println("Test456");
        }
    }
}
4

3 に答える 3

1

送信側スレッドは、System.in にデータを挿入するのを待っています (何かを入力するだけです)。ここでは、次の行でブロックされています: String TextSend = scantext.next();

于 2013-08-07T22:28:19.940 に答える
0

あるポートで送信し、別のポートで受信しています。このコードが独自のメッセージを送受信することを意図している場合、それらのポートは同じである必要があります。あなたの意図が実際に他の誰かとチャットすることである場合 (ローカルホスト上の自分とでも)、他のチャットは送信ポートで受信し、受信ポートで送信する必要があります。

また、ヘキサフラクションが言ったこと:

例外をキャッチせず、ほとんど役に立たないメッセージを出力します。代わりに e.printStackTrace() を使用してください。

そこにエラーが発生しました。エラーをキャッチして、代わりにメッセージを出力しました

于 2013-08-07T22:46:38.390 に答える
0

別のポートにデータを送信しているため、アプリケーションが機能していないようです。

static int sPort=11111;
static int rPort=11112;

同じポートに送信する必要があります (自分のコンピューターに送信する場合はlocal ip-addresslocalhostまたはを指定する必要があります127.0.0.1)。

最初の質問について

Why don't I receive any message

に接続してい127.0.0.1ますか? あなたのパラメータは正確には何ですか?

2番目の質問について

why does the program throw "Test123" when I force the program to terminate?

その瞬間にwhileループを壊すからです

try{
    DatagramSocket Socket = new DatagramSocket();
    while(true){
        String TextSend = scantext.next();
        sendData = TextSend.getBytes();
        DatagramPacket out = new DatagramPacket(sendData, sendData.length, chat.IP, chat.rPort);
        Socket.send(out);
    }
}

そのようにアプリケーションを終了すると、例外が発生します。

于 2013-08-07T22:26:22.680 に答える