了解客户端和服务器套接字

时间:2014-02-22 13:35:28

标签: java sockets

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

我是对还是错?

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

3 个答案:

答案 0 :(得分:0)

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

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

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

基本上, 服务器端套接字已创建并绑定到特定端口以进行传入请求侦听。 客户端连接到服务器套接字的侦听端口。 (不需要绑定到客户端,它是随机选择的) ServerSocket创建连接到客户端的Socket实例。 您可能希望将此服务器端套接字分配给Thread(或worker或其他),因为您希望ServerSocket继续侦听传入连接。

答案 1 :(得分:0)

  

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

没有。一个端口。

  

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

没有。一个端口。

  

连接到服务器套接字的套接字是否连接到客户端套接字并完成连接?

客户端连接到服务器,而不是连接到端口的套接字。客户端的连接结束由套接字表示。服务器端代表另一个套接字。

答案 2 :(得分:-1)

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