如何在java中关闭客户端套接字

时间:2014-02-22 11:52:47

标签: java

我在新线程中打开了一个服务器套接字端口,并将客户端连接到该端口。我希望在完成其工作后关闭客户端套接字。(我知道我的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);
        }
    }
}

1 个答案:

答案 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)。这样你最终会找到一个允许你使用的空的。您也不能指定任何端口,而不是为您选择随机可用端口。