• Socket类 以及 ServerSocket类 讲解


    Socket类

         套接字是网络连接的端点,套接字使应用可以从网络中读取数据,可以向网络中写入数据。不同计算机上的两个应用程序可以通过连接发送或接收字节流,以此达到相互通信的目的。

    为了从一个应用程序向另一个应用程序发送消息,需要知道另一个应用程序中套接字的 IP 地址和端口号,在java中,套接字由java.net.Socket 表示。

         要创建一个套接字,可以使用Socket类中众多构造函数中的一个。其中一个构造函数接收两个参数:主机号和端口号。

    public Socket (String host, int port)

         其中参数host是远程主机的名称或IP地址,参数port是连接远程应用程序的端口号,例如,想要通过80端口连接yahoo.com,可以使用如下语句创建Socket对象

    new Socket ("yahoo.com", 80);

         一旦成功创建了Socket类的实例,就可以使用该实例发送或接收字节流,要发送字节流,需要调用Socket类的getOutputStream() 方法获取一个java.io.OutputStream对象,

    要发送文本到远程应用程序,通常需要使用返回的OutputStream对象创建一个java.io.PrintWriter对象。若想要从连接的另一端接收字节流,需要调用Socket类的getInputStream()

    方法,该方法会返回一个java.io.InputStream对象。

      下面的代码创建了一个套接字,用于与本地Http服务器进行通信,发送HTTP请求,接收服务器的相应信息,以下代码创建了一个StringBuffer对象来保存信息,并输出。

    Socket socket = new Socket("127.0.0.1", "8080");
    OutputStream os = socket.getOutputStream();
    boolean autoflush = true;
    PrintWriter out = new PrintWriter(
      socket.getOutputStream(), autoflush);
    
    BufferedReader in = new BufferedReader(
       new InputStreamReader(socket.getInputStream()));
    //send an HTTP request to the web server
    out.println("GET /index.jsp HTTP/1.1");
    out.println("Host: localhost:8080");
    out.println("Connection Close");
    out.println();
    
    //read the response
    boolean loop = true;
    StringBuffer sb = new StringBuffer(8096);
    while (loop) {
                if (in.ready()) {
                    int i = 0;
                    while (i != -1){
                        i = in.read();
                        sb.append((char) i);
                    }
                    loop = flase;
                }
                Thread.currentThread().sleep(50);
            }
    System.out.println(sb.toString());
    socket.close();

    ServerSocket类

         Socket类表示一个客户端套接字,即,当想要连接远程服务器应用程序时创建的套接字。但如果你想要实现一个服务器应用程序(例如一个HTTP服务器或FTP服务器),

    你需要另一种方法,因为服务器必须时刻待命,它并不知道客户端应用程序会在什么时候发起连接,正因为如此,需要使用java.net.ServerSocket类。这是服务器套接字的实现。

         ServerSocket类和Socket类并不相同,服务器套接字要等待来自客户端的连接请求,当服务器套接字收到了连接请求后,它会创建一个Socket实例来处理与客户端的通信。

    要创建一个服务器套接字,可以使用ServerSocket类提供的4个构造函数中的任意一个,需要指明IP地址和服务器套接字侦听的端口号,典型情况下,IP地址可以为127.0.0.1,

    即服务器套接字会侦听本地机器接收到的连接请求,服务器套接字侦听的IP地址称为绑定地址。服务器套接字的另一个重要属性是backlog,后者表示在服务器拒绝接收传入的

    请求之前,传入的连接请求的最大队列长度。

       ServerSocket类的其中一个构造函数的签名如下:

    public ServerSocket (int port, int backLog, InetAddress bindingAddress);

         值得注意的是,在这个构造函数中,参数绑定地址必须是java.net.InetAddress类的实例。创建InetAddress对象的一种简单方法是调用其静态方法getByName(),

    传入包含主机名的字符串,代码如下所示:

    InetAddress.getByName("127.0.0.1");

         下面的一行代码创建了一个ServerSocket对象,ServerSocket对象侦听本地主机的8080端口,其backlog值为1;

    new ServerSocket(8080, 1, InetAddress.getByName("127.0.01"));

          创建了ServerSocket实例后,可以使其等待传入的连接请求,该连接请求会通过服务器套接字侦听的端口上绑定地址传入,这些工作可以通过调通ServerSocket类的accept方法

    完成。只有当接收到连接请求后,该方法才会返回,其返回值是一个Socket实例,然后,就可以如上所述使用该Socket对象与客户端应用程序进行字节流的发送/接收。

  • 相关阅读:
    爱信诺面试总结
    项目进展日志6
    项目进展日志5
    项目进展日志4
    项目进展日志3
    项目进展日志2
    项目阶段总结
    项目进展日志
    事物的ACID特性
    5.27作业
  • 原文地址:https://www.cnblogs.com/xinde123/p/7563185.html
Copyright © 2020-2023  润新知