Java 尝试发送UDP数据包时发生绑定异常

Java 尝试发送UDP数据包时发生绑定异常,java,sockets,exception,Java,Sockets,Exception,我正在制作一个点对点聊天应用程序,我已经为它编写了下面的代码,用于与一个人聊天。此代码适用于localhost(127.0.0.1),但不适用于任何特定ip地址(192.168.43.118)并引发bindexception。请帮忙。 import java.sql.*; import java.io.*; import java.net.*; import java.util.Scanner; public class communicate { public static void

我正在制作一个点对点聊天应用程序,我已经为它编写了下面的代码,用于与一个人聊天。此代码适用于localhost(127.0.0.1),但不适用于任何特定ip地址(192.168.43.118)并引发bindexception。请帮忙。

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

public class communicate {
    public static void main(String args[]) throws Exception {
        communicate ob = new communicate();
        String ip = "192.168.43.118";
        ob.text(ip);
    }
    public void text(String friend_ip) throws Exception{
        System.out.println("Press 'Exit' to exit the chat");
        int send_port = 40002;
        int receive_port = 40002;
        //InetAddress inetaddr = InetAddress.getByName(friend_ip);
        byte[] ipAddr = new byte[] { (byte)192, (byte)168, (byte)43, (byte)118 };
        System.out.println(ipAddr.length);
        InetAddress inetaddr = InetAddress.getByAddress(ipAddr);
        System.out.println("B");
        DatagramSocket serverSocket = new DatagramSocket(receive_port, inetaddr);
        System.out.println("YO");
        Runnable send = new SendMsg(send_port, friend_ip, serverSocket);
        Runnable receive = new GetMsg(friend_ip, receive_port, serverSocket);
        Thread t1 = new Thread(send);
        Thread t2 = new Thread(receive);
        t1.start();
        t2.start();
    }

    class SendMsg implements Runnable {
        private DatagramSocket senderSocket;
        private int send_port;
        private String sendto_ip;
        SendMsg(int port, String friend_ip, DatagramSocket ds)throws Exception {
            senderSocket = new DatagramSocket(64432);
            send_port = port;
            sendto_ip = friend_ip;
        }
        public void run(){
            try {
                while(true) {
                String sendString;
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                sendString = br.readLine();
                byte[] sendData = sendString.getBytes();
                byte[] ipAddr = new byte[] { (byte)192, (byte)168, (byte)43, (byte)118 };
                InetAddress inetAddress = InetAddress.getByAddress(ipAddr);
                DatagramPacket sendPacket = new DatagramPacket (sendData, sendData.length, inetAddress, send_port);
                senderSocket.send(sendPacket);
                System.out.println("Message Sent");
                }
            }
            catch(Exception e) {
                System.out.println("Exc at Sender\n" + e);
            }
            finally {
                if(senderSocket != null) senderSocket.close();
            }
        }

    }

    class GetMsg implements Runnable{
        private DatagramSocket serverSocket;
        private String friend_ip;
        private int receive_port;

        GetMsg(String ip, int port, DatagramSocket ds) throws Exception{
            friend_ip = ip;
            receive_port = port;
            serverSocket = ds;
        }
        public void run(){
            try {
                while(true) {
                byte[] receiveData = new byte[10000];
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                serverSocket.receive(receivePacket);
                String message = new String (receivePacket.getData(), 0, receivePacket.getLength());
                System.out.println(friend_ip + ": " + message);
                }
            }
            catch(Exception e) {
                System.out.println("Exc at Rec\n" + e);
            }
            finally {
                if(serverSocket != null) serverSocket.close();
            }
        }
    }
}

当我在终端上运行它时,显示以下输出

Press 'Exit' to exit the chat
4
B
Exception in thread "main" java.net.BindException: Cannot assign requested address (Bind failed)
        at java.base/java.net.PlainDatagramSocketImpl.bind0(Native Method)
        at java.base/java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:131)
        at java.base/java.net.DatagramSocket.bind(DatagramSocket.java:394)
        at java.base/java.net.DatagramSocket.<init>(DatagramSocket.java:244)
        at java.base/java.net.DatagramSocket.<init>(DatagramSocket.java:301)
        at communicate.text(communicate.java:21)
        at communicate.main(communicate.java:10)
按“退出”退出聊天
4.
B
线程“main”java.net.BindException中出现异常:无法分配请求的地址(绑定失败)
位于java.base/java.net.PlainDatagramSocketImpl.bind0(本机方法)
位于java.base/java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:131)
位于java.base/java.net.DatagramSocket.bind(DatagramSocket.java:394)
位于java.base/java.net.DatagramSocket(DatagramSocket.java:244)
位于java.base/java.net.DatagramSocket(DatagramSocket.java:301)
在communicate.text(communicate.java:21)
在communicate.main(communicate.java:10)

由于没有打印“YO”,所以我试图创建DatagramSocket的text方法中似乎出现了错误。我哪里出错了?

如果要读取,请不要绑定远程地址。只需创建一个本地UDP套接字(它将是一个服务器套接字)并读取/写入其缓冲区。您只能绑定到本地网络接口,并且必须先初始化这些接口。因此,您无法绑定到未使用的Wifi或未拔出的以太网适配器

如果要在不同线程上测试同一java程序中的发送方和接收方,则必须使用两个不同的套接字


提示:用于字符串IP输入,您不需要字节数组。

您正在尝试绑定到非本地IP地址。为什么你要使用三个插座,而实际上只使用其中的两个仍然是个谜。