簡體   English   中英

如何在java中關閉客戶端套接字

[英]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-說明:

表示嘗試將套接字綁定到本地地址和端口時發生錯誤。 通常,端口正在使用中,或者無法分配請求的本地地址。

導致該異常的其他原因可能包括您沒有足夠高的權限,但這不太可能,因為您使用了如此高的端口號。

如果不能保證要使用的端口是開放的,則應該有一個循環,並且只要繼續獲取java.net.BindException,就應該繼續嘗試以下端口( port + 1 )。 這樣,您最終會找到一個空的,可以使用。 您也不能指定任何端口,否則會為您選擇一個隨機可用端口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM