[英]how to close the client socket in java
我已經在新線程中打開了服務器套接字端口,並將客戶端連接到該端口。我希望在客戶端套接字完成工作后將其關閉。(而且我知道run()的while循環中存在一些問題方法,但我無法理解,當我運行服務器應用程序以打開端口並偵聽連接時,出現錯誤,提示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);
}
}
}
您需要更改循環,以便在循環外部創建服務器套接字。 每個端口只能打開一個插座。 打開它后,您可以根據需要在該套接字上接受盡可能多的連接。
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,就應該繼續嘗試以下端口( port + 1
)。 這樣,您最終會找到一個空的,可以使用。 您也不能指定任何端口,否則會為您選擇一個隨機可用端口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.