【问题标题】:Understanding client and server sockets了解客户端和服务器套接字
【发布时间】:2014-03-24 04:24:21
【问题描述】:

我有一个问题。 我不完全了解客户端和服务器套接字是如何工作的? 我的理解是 创建服务器套接字时,它有许多可以打开的端口。在服务器端创建套接字对象,这些对象连接到服务器套接字的不同端口。连接到服务器套接字的套接字连接到客户端套接字并完成连接?

我是对还是错?

    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");
            ServerSocket serverSocket = new ServerSocket(Portnumber);
            System.out.println("one socket port opened");
            while (true)
            {
                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);
        }
    }
    }

还有客户

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);
    }       
}   
}

【问题讨论】:

标签: java sockets


【解决方案1】:

您为 ServerSocket 提供的端口号是服务器套接字对传入请求的侦听端口,而您在客户端代码中指定的端口号是您的客户端将要连接的服务器端侦听端口。

请检查其他服务器端套接字示例,包括这个。 http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html

检查服务器套接字的 accept() 是如何工作的,它的返回值是什么。

所以基本上, 服务器端套接字已创建并绑定到特定端口以进行传入请求侦听。 客户端连接到服务器套接字的侦听端口。 (不需要绑定客户端,随机选择) ServerSocket 创建连接到客户端的 Socket 实例。 您可能希望将此服务器端套接字提供给单独的线程(或工作线程或其他),因为您希望 ServerSocket 保持侦听传入连接。

【讨论】:

  • 监听端口和客户端尝试连接的端口是一回事。
  • 是的,你做到了。读你的第一句话。 whereas 毫无意义。
  • @EJP "而客户端的端口号是客户端实际尝试连接的端口。=> 客户端源代码中用于连接服务器端的端口号" 这是否让事情更清楚?看起来我的写作模棱两可。
  • 所以你认为他们是不同的,而他们不是,这就是我最初所说的,你声称你同意的。下定决心。
  • @EJP 我是说客户端指定远程端的监听端口,而服务器端指定它的监听端口。我试图解释服务器端和客户端之间的不同观点。是的,它确实意味着服务器端的相同端口号。如果你还是不明白,那也没关系。可能我的英文不够好,你看不懂。
【解决方案2】:

我的理解是,当创建服务器套接字时,它有许多可以打开的端口。

没有。一个端口。

socket对象在服务器端创建,连接到服务器socket的不同端口。

没有。一个端口。

连接到服务器socket的socket连接到客户端socket并完成连接?

client 连接到 server,而不是连接到一个 socket,而是一个 port。客户端的连接端由套接字表示。服务器端代表另一个套接字。

【讨论】:

    【解决方案3】:

    服务器套接字正在侦听特定端口 ex 80。 当服务器接受连接时,将创建一个具有特定端口的接受套接字,该端口可以引导与客户端的连接

    【讨论】:

    • 使用 same 端口,而不是“特定端口”。
    猜你喜欢
    • 2018-06-10
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2011-11-15
    • 1970-01-01
    • 2014-06-04
    相关资源
    最近更新 更多