"address already in use cannot bind" 创建 Java DatagramSocket 对象时。
"address already in use cannot bind" when creating a Java DatagramSocket object.
我通过 MyDatagramSocket 将一个整数传递给 DatagramSocket 的构造函数,但我收到错误:"address already in use: Cannot bind"。我是 运行 来自 NetBeans 的客户端和来自终端的服务器。我尝试了几个不同的端口,重新启动了 Netbeans - 关闭终端,甚至尝试重新启动计算机。
我尝试使用 netstat 查找端口,但我什至没有找到它。这是我的代码:
Client.java
package datagramcounterserver;
import java.io.*;
public class Client {
public static void main(String[] args) {
InputStreamReader is = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(is);
try {
System.out.println("Welcome to the Daytime client. \n" + "What is the name of the server host?");
String hostName = br.readLine();
if (hostName.length() == 0)
hostName = "localhost";
System.out.println("What is the port number of the server host?");
String portNum = br.readLine();
if (portNum.length() == 0) {
portNum = "223";
}
System.out.println("Counter receiver from the server: " + Helper.getCounter(hostName, portNum));
}
catch(Exception ex) {
ex.printStackTrace();
}
}
}
Helper.java
package datagramcounterserver;
import java.net.*;
import java.net.InetAddress;
public class Helper {
public static int getCounter(String hostName, String portNum) {
int counter = 0;
String message = "1";
try {
InetAddress serverHost = InetAddress.getByName(hostName);
int serverPort = Integer.parseInt(portNum);
MyDatagramSocket mySocket = new MyDatagramSocket(serverPort);
mySocket.sendMessage(serverHost, serverPort, " ");
message = mySocket.receiveMessage();
System.out.println("Message received: " + message);
counter = Integer.parseInt(message.trim());
mySocket.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
return counter;
}
}
MyDatagramSocket.java
package datagramcounterserver;
import java.net.*;
import java.io.*;
public class MyDatagramSocket extends DatagramSocket {
final int MAX_LEN = 10;
MyDatagramSocket(int portNo) throws SocketException {
super(portNo);
}
public void sendMessage(InetAddress receiverHost, int receiverPort, String message) throws IOException {
byte[] sendBuffer = message.getBytes();
DatagramPacket datagram = new DatagramPacket(sendBuffer, sendBuffer.length, receiverHost, receiverPort);
this.send(datagram);
}
public String receiveMessage() throws IOException {
byte[] receiveBuffer = new byte[MAX_LEN];
DatagramPacket datagram = new DatagramPacket(receiveBuffer, MAX_LEN);
this.receive(datagram);
String message = new String(receiveBuffer);
return message;
}
}
MyServerDatagraphSocket.java
package datagramcounterserver;
import java.net.*;
import java.io.*;
public class MyServerDatagramSocket extends DatagramSocket {
static final int MAX_LEN = 100;
MyServerDatagramSocket(int portNo) throws SocketException {
super(portNo);
}
public void sendMessage(InetAddress receiverHost, int receiverPort, String message) throws IOException {
byte[] sendBuffer = message.getBytes();
DatagramPacket datagram = new DatagramPacket(sendBuffer, sendBuffer.length, receiverHost, receiverPort);
this.send(datagram);
}
public String receiveMessage() throws IOException {
byte[] receiveBuffer = new byte[MAX_LEN];
DatagramPacket datagram = new DatagramPacket(receiveBuffer, MAX_LEN);
this.receive(datagram);
String message = new String(receiveBuffer);
return message;
}
public DatagramMessage receiveMessageAndSender() throws IOException {
byte[] receiveBuffer = new byte[MAX_LEN];
DatagramPacket datagram = new DatagramPacket(receiveBuffer, MAX_LEN);
this.receive(datagram);
DatagramMessage returnVal = new DatagramMessage();
returnVal.putVal(new String(receiveBuffer), datagram.getAddress(), datagram.getPort());
return returnVal;
}
}
Server.java
package datagramcounterserver;
import java.io.*;
public class Server {
static int counter = 0;
public static void main(String[] args) {
int serverPort = 223;
if (args.length == 1)
serverPort = Integer.parseInt(args[0]);
try {
MyServerDatagramSocket mySocket = new MyServerDatagramSocket(serverPort);
System.out.println("Counter server ready.");
while (true) {
DatagramMessage request = mySocket.receiveMessageAndSender();
System.out.println("Request received");
increment();
System.out.println("counter sent "+ counter);
mySocket.sendMessage(request.getAddress(), request.getPort(), String.valueOf(counter));
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
static private synchronized void increment() {
counter++;
}
}
你的服务器和客户端都在绑定端口,第二个启动绑定失败。采用单个 int 参数的 DatagramSocket
构造函数等同于创建 DatagramSocket 并调用 socket.bind(port)
。
虽然这是您希望在服务器上的行为,但在客户端上您不想绑定到该端口 - 您想要连接到服务器。这是通过使用 connect() 方法来完成的。您可能想将 MyDatagramSocket
class' 构造函数更改为如下内容:
MyDatagramSocket(String address, int portNo) throws SocketException {
super();
connect(InetAddress.getByName(address), portNo);
}
我通过 MyDatagramSocket 将一个整数传递给 DatagramSocket 的构造函数,但我收到错误:"address already in use: Cannot bind"。我是 运行 来自 NetBeans 的客户端和来自终端的服务器。我尝试了几个不同的端口,重新启动了 Netbeans - 关闭终端,甚至尝试重新启动计算机。
我尝试使用 netstat 查找端口,但我什至没有找到它。这是我的代码:
Client.java
package datagramcounterserver;
import java.io.*;
public class Client {
public static void main(String[] args) {
InputStreamReader is = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(is);
try {
System.out.println("Welcome to the Daytime client. \n" + "What is the name of the server host?");
String hostName = br.readLine();
if (hostName.length() == 0)
hostName = "localhost";
System.out.println("What is the port number of the server host?");
String portNum = br.readLine();
if (portNum.length() == 0) {
portNum = "223";
}
System.out.println("Counter receiver from the server: " + Helper.getCounter(hostName, portNum));
}
catch(Exception ex) {
ex.printStackTrace();
}
}
}
Helper.java
package datagramcounterserver;
import java.net.*;
import java.net.InetAddress;
public class Helper {
public static int getCounter(String hostName, String portNum) {
int counter = 0;
String message = "1";
try {
InetAddress serverHost = InetAddress.getByName(hostName);
int serverPort = Integer.parseInt(portNum);
MyDatagramSocket mySocket = new MyDatagramSocket(serverPort);
mySocket.sendMessage(serverHost, serverPort, " ");
message = mySocket.receiveMessage();
System.out.println("Message received: " + message);
counter = Integer.parseInt(message.trim());
mySocket.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
return counter;
}
}
MyDatagramSocket.java
package datagramcounterserver;
import java.net.*;
import java.io.*;
public class MyDatagramSocket extends DatagramSocket {
final int MAX_LEN = 10;
MyDatagramSocket(int portNo) throws SocketException {
super(portNo);
}
public void sendMessage(InetAddress receiverHost, int receiverPort, String message) throws IOException {
byte[] sendBuffer = message.getBytes();
DatagramPacket datagram = new DatagramPacket(sendBuffer, sendBuffer.length, receiverHost, receiverPort);
this.send(datagram);
}
public String receiveMessage() throws IOException {
byte[] receiveBuffer = new byte[MAX_LEN];
DatagramPacket datagram = new DatagramPacket(receiveBuffer, MAX_LEN);
this.receive(datagram);
String message = new String(receiveBuffer);
return message;
}
}
MyServerDatagraphSocket.java
package datagramcounterserver;
import java.net.*;
import java.io.*;
public class MyServerDatagramSocket extends DatagramSocket {
static final int MAX_LEN = 100;
MyServerDatagramSocket(int portNo) throws SocketException {
super(portNo);
}
public void sendMessage(InetAddress receiverHost, int receiverPort, String message) throws IOException {
byte[] sendBuffer = message.getBytes();
DatagramPacket datagram = new DatagramPacket(sendBuffer, sendBuffer.length, receiverHost, receiverPort);
this.send(datagram);
}
public String receiveMessage() throws IOException {
byte[] receiveBuffer = new byte[MAX_LEN];
DatagramPacket datagram = new DatagramPacket(receiveBuffer, MAX_LEN);
this.receive(datagram);
String message = new String(receiveBuffer);
return message;
}
public DatagramMessage receiveMessageAndSender() throws IOException {
byte[] receiveBuffer = new byte[MAX_LEN];
DatagramPacket datagram = new DatagramPacket(receiveBuffer, MAX_LEN);
this.receive(datagram);
DatagramMessage returnVal = new DatagramMessage();
returnVal.putVal(new String(receiveBuffer), datagram.getAddress(), datagram.getPort());
return returnVal;
}
}
Server.java
package datagramcounterserver;
import java.io.*;
public class Server {
static int counter = 0;
public static void main(String[] args) {
int serverPort = 223;
if (args.length == 1)
serverPort = Integer.parseInt(args[0]);
try {
MyServerDatagramSocket mySocket = new MyServerDatagramSocket(serverPort);
System.out.println("Counter server ready.");
while (true) {
DatagramMessage request = mySocket.receiveMessageAndSender();
System.out.println("Request received");
increment();
System.out.println("counter sent "+ counter);
mySocket.sendMessage(request.getAddress(), request.getPort(), String.valueOf(counter));
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
static private synchronized void increment() {
counter++;
}
}
你的服务器和客户端都在绑定端口,第二个启动绑定失败。采用单个 int 参数的 DatagramSocket
构造函数等同于创建 DatagramSocket 并调用 socket.bind(port)
。
虽然这是您希望在服务器上的行为,但在客户端上您不想绑定到该端口 - 您想要连接到服务器。这是通过使用 connect() 方法来完成的。您可能想将 MyDatagramSocket
class' 构造函数更改为如下内容:
MyDatagramSocket(String address, int portNo) throws SocketException {
super();
connect(InetAddress.getByName(address), portNo);
}