[英]BindException: Address already in use
I am trying my hands on socket programming in Java. To get things roll, I tried a very simple server and client code snippet as below我正在 Java 尝试进行套接字编程。为了让事情顺利进行,我尝试了一个非常简单的服务器和客户端代码片段,如下所示
public class Server {
//initialize socket and input stream
private Socket socket = null;
private ServerSocket server = null;
private DataInputStream in = null;
public Server(int port) {
// starts server and waits for a connection
while (true) {
try{
server = new ServerSocket(port);
System.out.println("Server started");
System.out.println("Waiting for a client ...");
socket = server.accept();
System.out.println("Client accepted");
// takes input from the client socket
in = new DataInputStream(
new BufferedInputStream(socket.getInputStream()));
String line = "";
// reads message from client until "Over" is sent
while (!line.equals("Over"))
{
try
{
line = in.readUTF();
System.out.println(line);
}
catch(IOException i)
{
System.out.println(i);
}
}
System.out.println("Closing connection");
// close connection
socket.shutdownInput();
socket.shutdownOutput();
socket.close();
in.close();
}
catch(IOException i){
System.out.println(i);
}
}
}
public static void main(String args[]) {
new Server(5000);
}
}
Client.java looks like below Client.java 如下所示
public class Client {
// initialize socket and input output streams
private Socket socket = null;
private DataInputStream input = null;
private DataOutputStream out = null;
// constructor to put ip address and port
public Client(String address, int port)
{
// establish a connection
try
{
socket = new Socket(address, port);
System.out.println("Connected");
// takes input from terminal
input = new DataInputStream(System.in);
// sends output to the socket
out = new DataOutputStream(socket.getOutputStream());
}
catch(UnknownHostException u)
{
System.out.println(u);
}
catch(IOException i)
{
System.out.println(i);
}// string to read message from input
String line = "";
// keep reading until "Over" is input
while (!line.equals("Over"))
{
try
{
line = input.readLine();
out.writeUTF(line);
}
catch(IOException i)
{
System.out.println(i);
}
}
// close the connection
try
{
input.close();
out.close();
socket.close();
}
catch(IOException i)
{
System.out.println(i);
}
}
public static void main(String args[]) {
Client client = new Client("127.0.0.1", 5000);
}
}
It works fine for the first connection with the client.它适用于与客户端的第一次连接。 As soon as the client sends Over server starts giving exception java.net.BindException: Address already in use
.一旦客户端发送Over服务器开始给出异常java.net.BindException: Address already in use
。
Even if I am closing the socket, why the port is in use?即使我正在关闭套接字,为什么端口正在使用中?
The following lines of code is trying to create ServerSocket
again (in fact, infinite number of times) on the port, 5000
and that is why you are getting the error.以下几行代码试图在端口5000
上再次创建ServerSocket
(实际上是无数次),这就是您收到错误的原因。
while (true) {
try{
server = new ServerSocket(port);
Do it as follows:做如下:
try{
server = new ServerSocket(port);
}catch(IOException i){
System.out.println(i);
}
while (true) {
try{
Take Server out of while loop and some more code changes将服务器从 while 循环中取出并更改更多代码
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
//initialize socket and input stream
private Socket socket = null;
private ServerSocket server = null;
private DataInputStream in = null;
public Server(int port) throws IOException {
// starts server and waits for a connection
server = new ServerSocket(port);
while (true) {
try{
System.out.println("Server started");
System.out.println("Waiting for a client ...");
socket = server.accept();
System.out.println("Client accepted");
// takes input from the client socket
in = new DataInputStream(
new BufferedInputStream(socket.getInputStream()));
String line = "";
// reads message from client until "Over" is sent
while (!line.equals("Over"))
{
try
{
line = in.readUTF();
System.out.println(line);
}
catch(IOException i)
{
System.out.println(i);
}
}
System.out.println("Closing connection");
// close connection
socket.close();
in.close();
}
catch(IOException i){
System.out.println(i);
}
}
}
public static void main(String args[]) throws IOException {
new Server(5000);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.