【问题标题】:how to close the client socket in java如何在java中关闭客户端套接字
【发布时间】:2014-02-22 11:52:46
【问题描述】:

我在一个新线程中打开了一个服务器套接字端口并将客户端连接到该端口。我希望在客户端套接字完成工作后关闭它。(我知道我的 while 循环中存在一些问题run() 方法,但我无法理解它。 当我运行我的服务器应用程序以打开一个端口并侦听一个连接时,它会给出一个错误提示 java.net.BindException: Address already in use: 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);
        }
    }
}

【问题讨论】:

  • 好的,同一个服务器的多个端口怎么打开?
  • 忘记我说的话。您的循环尝试多次打开同一端口上的服务器套接字。请参阅 zahorak 的回答。

标签: java


【解决方案1】:

您需要更改循环,以便在循环之外创建服务器套接字。 每个端口只能打开一个套接字。打开它后,您可以在该套接字上接受任意数量的连接。

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

【讨论】:

  • 在我在循环外和 try 块内打开服务器套接字后,它仍然给出相同的错误。其次,我不明白您所说的“每个端口只能打开一个套接字”是什么意思
  • 我已经澄清了我的答案
  • 如果有客户端连接的端口仍然打开,在客户端关闭后,它是否应该仍然打开以接受新客户端(或再次相同的客户端)?
  • 你正在混合ServerSocket(打开一个端口,开始使用这个端口,保留这个端口,正在监听这个端口,接受这个端口上的传入客户端连接,...) Socket(处理服务器和某些客户端之间的特定连接)。请查看What is the difference between Socket and ServerSocket?,了解有关差异的更多信息。
  • 所以这意味着我必须在我的服务器代码中创建一个服务器套接字和多个套接字?
猜你喜欢
  • 2012-04-23
  • 2015-04-07
  • 2013-01-16
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 2018-07-12
相关资源
最近更新 更多