简体   繁体   English

UDP网络中的绑定错误

[英]Binding error in UDP networking

In my Server Client program by UDP my Server receives message, shows that message to the console and from Client and send it to Client again. 在通过UDP的我的服务器客户端程序中,我的服务器接收消息,将该消息显示到控制台并从客户端显示,然后再次发送给客户端。

Here is my Server, it takes input of its name from command line 这是我的服务器,它从命令行输入名称

import java.io.IOException;
import java.net.*;

class Stest implements Runnable {
private String str[];
DatagramSocket sock;
DatagramPacket pack;
String Sname;

Stest(String str[]) throws SocketException, UnsupportedEncodingException, IOException {
    this.str = str;
    this.Sname = str[0];
    System.out.println(Sname);
    new Thread(this).start();
}

public void run() {
    while (true) {
        byte[] data = new byte[1024];
        try {
            sock = new DatagramSocket(5050);
        } catch (SocketException ex) {
            Logger.getLogger(test.class.getName()).log(Level.SEVERE, null, ex);
        }
        pack = new DatagramPacket(data, data.length);
        try {
            sock.receive(pack);
        } catch (IOException e) {
            e.printStackTrace();
        }
        String s = null;
        try {
            s = new String(pack.getData(), "UTF-8");
            System.out.println(s);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        DatagramPacket dp = null;
        try {
            dp = new DatagramPacket(s.getBytes("UTF-8"), s.getBytes("UTF-8").length);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        dp.setPort(1);
        dp.setAddress(pack.getAddress());
        try {
            sock.send(dp);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

}

public class test{
public static void main(String[] args) {
    try {
       Stest stest= new Stest(args);

    } catch (IOException ex) {
        Logger.getLogger(test.class
                .getName()).log(Level.SEVERE, null, ex);
    }
}
}

And here is my Client that takes its name, listening port, server ip address and server name and sends message to server and receives that message from Server again and shows that message to the console. 这是我的客户端,它使用其名称,侦听端口,服务器ip地址和服务器名称,并将消息发送到服务器,并再次从服务器接收该消息,并将该消息显示到控制台。

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

class UDPClient {
String username;
String listening_port;
String serverAddress;
String servername;
public UDPClient(String username, String listening_port, String serverAddress, String servername) {
    this.username = username;
    this.listening_port = listening_port;
    this.serverAddress = serverAddress;
    this.servername = servername;
}
}
class ClientListen extends UDPClient implements Runnable {
Thread t;
DatagramSocket clientlistensocket;
DatagramPacket clientlistenpacket;
byte[] data;
public ClientListen(String username, String listening_port, String serverAddress, String servername) {
    super(username, listening_port, serverAddress, servername);
    try {
        clientlistensocket = new DatagramSocket(Integer.parseInt(listening_port));

    } catch (Exception e) {
        System.out.println(e + "    ClientListen");
    }
    t = new Thread(this, "ClientListen");
    t.start();
}

public void go() {
    String messag = new String(clientlistenpacket.getData());
    System.out.println(messag);
}

void processing() {
    data=new byte[1024];

    clientlistenpacket = new DatagramPacket(data,data.length);

    try {
        clientlistensocket.receive(clientlistenpacket);
        go();
    } catch (Exception e) {
        System.out.println(e + "   ClientlistenProcessing");
    }
}
public void run() {
    while (true) {
        try {
            processing();
        } catch (Exception e) {
            System.out.println(e + "Processing+run");
        }
    }
}

}
class ClientSpeak extends UDPClient {

DatagramPacket clientspeakpacket;
DatagramSocket clientspeaksocket;
InetAddress ipAddress;
Thread t;

public ClientSpeak(String username, String listening_port, String serverAddress, String servername) {
    super(username, listening_port, serverAddress, servername);

    try {

        clientspeaksocket = new DatagramSocket();

    } catch (Exception e) {
        System.out.println(e + "ClientSpeak");
    }
    try {

        String firstmessage = "Via:" + servername + "To:" + servername + "From:" + username + "Port:" + listening_port;
        byte[] firstdata = firstmessage.getBytes();
        ipAddress = InetAddress.getByName(serverAddress);

        clientspeakpacket = new DatagramPacket(firstdata, firstdata.length, ipAddress, 5050);
        clientspeaksocket.send(clientspeakpacket);
    } catch (Exception e) {
        System.out.println(e + "Clientspeak");
    }
}


}

public class testC {

public static void main(String[] args) {
    if (args.length == 4) {
        String username = args[0].trim();
        String listening_port = args[1].trim();
        String serverAddress = args[2].trim();
        String servername = args[3].trim();

        ClientSpeak clientSpeak = new ClientSpeak(username, listening_port, serverAddress, servername);
        ClientListen clientListen = new ClientListen(username, listening_port, serverAddress, servername);
    }
}
}

But it is always showing error like: 但是它总是显示如下错误:

S
Via:STo:SFrom:nahPort:1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
Nov 21, 2016 7:20:34 PM Stest run
SEVERE: null
java.net.BindException: Address already in use: Cannot bind
at java.net.DualStackPlainDatagramSocketImpl.socketBind(Native Method)
at    java.net.DualStackPlainDatagramSocketImpl.bind0(DualStackPlainDatagramSocketImpl.java:84)
at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:93)
at java.net.DatagramSocket.bind(DatagramSocket.java:392)
at java.net.DatagramSocket.<init>(DatagramSocket.java:242)
at java.net.DatagramSocket.<init>(DatagramSocket.java:299)
at java.net.DatagramSocket.<init>(DatagramSocket.java:271)
at Stest.run(test.java:41)
at java.lang.Thread.run(Thread.java:745)

What should i do? 我该怎么办?

The problem is that in the server within the while loop you are continuously trying to bind the a new datagram socket to port 5050 问题是在服务器中的while循环内,您一直在尝试将新的数据报套接字绑定到端口5050

try {
    sock = new DatagramSocket(5050);
} catch (SocketException ex) {
    Logger.getLogger(test.class.getName()).log(Level.SEVERE, null, ex);
}

The second time, after the server read and processed the UDP message, it'll try to bind and it will get an exception. 第二次,服务器读取并处理了UDP消息后,它将尝试进行绑定,并且将获得异常。

You need to create and bind the UDP socket only once, before the while loop and then use that socket for the whole communication within the while loop. 在while循环之前,您只需创建和绑定UDP套接字一次,然后将该套接字用于while循环中的整个通信。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM