我在新线程中打开了一个服务器套接字端口,并将客户端连接到该端口。我希望在完成其工作后关闭客户端套接字。(我知道我的while循环中存在一些问题run()方法,但我无法理解它。 当我运行我的服务器应用程序打开一个端口并听取连接时,它会给出一个错误,说java.net.BindException:地址已在使用中:JVM_Bind
请详细告诉我我在这里做错了什么,并详细给出了一个理论上的解决方案。 如果这是一个愚蠢的问题,请原谅我。
Jshirwani
服务器
import java.io.*;
import java.net.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.*;
public class TryThreads extends Thread
{
private int Portnumber;
private static String inputLine;
public TryThreads(int portNumber)
{
Portnumber = portNumber;
setDaemon(false);
}
public static void main(String[] args)
{
//create three threads
Thread first = new TryThreads(63400);
Thread second = new TryThreads(63401);
first.start();
second.start();
//third.start();
System.out.println("ending main");
return;
}
public void run()
{
//System.out.println("one socket port opened");
try
{
System.out.println("one socket port opened");
System.out.println("one socket port opened");
while (true)
{
ServerSocket serverSocket = new ServerSocket(Portnumber);
System.out.println("ending main2");
//System.out.println("one socket port opened");
Socket clientSocket = serverSocket.accept();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
while((inputLine = bufferedReader.readLine()) != null)
System.out.println(inputLine);
}
}
catch(IOException e)
{
System.out.println(e);
}
}
}
客户端
import java.io.*;
import java.net.Socket;
public class client
{
private static PrintWriter printWriter;
public static void main(String[] args)
{
BufferedReader in = null;
try
{
Socket socket = new Socket("localhost",63400);
printWriter = new PrintWriter(socket.getOutputStream(),true);
printWriter.println("Hello Socket");
printWriter.println("EYYYYYAAAAAAAA!!!!");
socket.close();
}
catch(Exception e)
{
System.out.println(e);
}
}
}
答案 0 :(得分:2)
您需要更改循环,以便在循环外创建服务器套接字。 每个端口只能打开一个套接字。打开它后,您可以根据需要接受该套接字上的多个连接。
ServerSocket serverSocket = new ServerSocket(Portnumber);
while (true) {
System.out.println("ending main2");
//System.out.println("one socket port opened");
Socket clientSocket = serverSocket.
BufferedReader bufferedReader = new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
while((inputLine = bufferedReader.readLine()) != null)
System.out.println(inputLine);
}
更新澄清:
您描述的异常意味着在该端口上已经建立了连接,它可以来自您的应用程序(您在循环中打开具有相同端口的套接字),或者它可以来自不同的应用程序在端口上侦听(任何正在运行的服务,bittorrent,skype,......)
java.net.BindException - 说明:
表示尝试将套接字绑定到本地地址和端口时发生错误。通常,端口正在使用中,或者无法分配请求的本地地址。
该异常的其他原因可能包括您没有足够高的权限,但由于您使用如此高的端口号,因此不太可能。
如果你不能保证,你想要使用的端口是开放的,那么你应该有一个循环,只要你不断获得java.net.BindException,你就应该继续尝试以下端口(port + 1
)。这样你最终会找到一个允许你使用的空的。您也不能指定任何端口,而不是为您选择随机可用端口。