0

我想编写一个 UDP java 聊天程序,我可以在其中使用该程序与另一个人发送和接收消息。我自己弄清楚了套接字编程(谷歌搜索等),所以我并不完全理解每一个部分。基本思想是读取一个你想与之聊天的随机 IP 作为字符串,将其转换为 IP 并启动两个线程,一个用于从端口 A 发送消息,一个用于在端口 B 接收消息(线程用于都能够同时发送和接收消息)。每个线程都有自己的类。到目前为止,一切都很好。现在这两个类都有 run 方法,它们都在一个大的 try-catch 块中。在两个 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

您的应用程序似乎无法正常工作,因为您将数据发送到不同的端口。

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

您需要将其发送到同一个端口(如果将其发送到您自己的计算机,您需要指定您的local ip-address,localhost127.0.0.1)。

至于你的第一个问题

Why don't I receive any message

你在连接127.0.0.1吗?你的参数到底是什么?

至于你的第二个问题

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 回答
0

您在一个端口上发送,在另一个端口上接收。如果您打算让此代码发送和接收自己的消息,则这些端口需要相同。如果您的意图是实际与其他人聊天(即使在 localhost 上与您自己聊天),则其他聊天必须在您的发送端口上接收并在您的接收端口上发送。

另外,hexafraction 说:

不要捕获异常并打印下一个无用的消息。请改用 e.printStackTrace()。

那就是您的错误所在,您抓住了它并打印了您的消息

于 2013-08-07T22:46:38.390 回答