《深入剖析Tomcat》一1.2 Socket类

简介: 本节书摘来自华章出版社《深入剖析Tomcat》一书中的第1章,第1.2节,作者(美)Budi Kurniawan,更多章节内容可以访问云栖社区“华章计算机”公众号查看

1.2 Socket类

套接字是网络连接的端点。套接字使应用程序可以从网络中读取数据,可以向网络中写入数据。不同计算机上的两个应用程序可以通过连接发送或接收字节流,以此达到相互通信的目的。为了从一个应用程序向另一个应用程序发送消息,需要知道另一个应用程序中套接字的IP地址和端口号。在Java中,套接字由java.net.Socket表示。
要创建一个套接字,可以使用Socket类中众多构造函数中的一个。其中一个构造函数接收两个参数:主机名和端口号。

public Socket (java.lang.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服务器进行通信(127.0.0.1 表示一个本地主机),发送HTTP请求,接收服务器的响应信息。以下代码创建了一个StringBuffer对象来保存响应信息,并将其输出到控制台上。
image
image

注意 为了从Web服务器上获取正确的响应信息,需要发送一个遵循HTTP协议的HTTP请求。如果你已经阅读了前一节中关于HTTP的描述,你应该已经可以理解以上代码中关于发送HTTP请求的方法。
注意 可以使用本书中的com.brainysoftware.pyrmont.util.HttpSniffer类来发送HTTP请求,并显示响应信息。要使用该Java程序,需要连接到Internet。但是,要注意的是,防火墙可能会使程序失败。
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.0.1"));

创建了ServerSocket实例后,可以使其等待传入的连接请求,该连接请求会通过服务器套接字侦听的端口上绑定地址传入。这些工作可以通过调用ServerSocket类的accept方法完成。只有当接收到连接请求后,该方法才会返回,其返回值是一个Socket实例。然后,就正如1.2节所述,可以使用该Socket对象与客户端应用程序进行字节流的发送/接收。实际上,在本章的应用程序中,accept是唯一会使用到的方法。

相关文章
|
3月前
muduo源码剖析之Socket类
封装了一个sockfd相关的设置。比较简单,已经编写注释。
16 0
|
6月前
|
安全 网络协议 Java
Thread类的用法 && 线程安全 && 多线程代码案例 && 文件操作和 IO && 网络原理初识 &&UDP socket
Thread类的用法 && 线程安全 && 多线程代码案例 && 文件操作和 IO && 网络原理初识 &&UDP socket
39 0
|
4月前
|
网络协议 Java
【零基础学Java】—Socket类(五十五)
【零基础学Java】—Socket类(五十五)
【零基础学Java】—Socket类(五十五)
|
6月前
|
缓存 移动开发 网络协议
TCP编写服务器,客户端以及遇到的两个问题,Socket,ServerScket 类,flush(),方法。以及多线程解决,及改进的线程池写法,IO多路复用的思想,C10K,C10M的阐述。万字超细
TCP编写服务器,客户端以及遇到的两个问题,Socket,ServerScket 类,flush(),方法。以及多线程解决,及改进的线程池写法,IO多路复用的思想,C10K,C10M的阐述。万字超细
|
11月前
|
前端开发 安全 Java
Tomcat - 模拟Tomcat的webappClassLoader加载自己war包应用内不同版本类实现相互共存与隔离
Tomcat - 模拟Tomcat的webappClassLoader加载自己war包应用内不同版本类实现相互共存与隔离
150 0
|
11月前
|
Java 应用服务中间件 Linux
Java 在linux或者tomcat下使用java.jwt.*这个类,报java.awt.headless 报空异常
在开发的过程中使用到了java.jwt.*包下的东西,在开发工具中使用没问题,但是如果到了单独的tomcat或Linux里就会报:java.awt.headless null空异常,再去配置java mv?非常麻烦,看我是如何解决的。
92 0
|
数据可视化 Java 应用服务中间件
眼见为实:被误导的Tomcat工作原理系列之poller线程是做socket读写的线程吗?
眼见为实:用页面可视化的方式带你看到Tomcat工作原理,它里面有哪些线程,在每次请求过来的时候做了什么工作? 纠正部分网友对于Tomcat工作原理理解的误区,明确Tomcat里到底是哪个线程在做socket读写?
182 0
眼见为实:被误导的Tomcat工作原理系列之poller线程是做socket读写的线程吗?
|
存储 Java 应用服务中间件
Tomcat原理系列之七:详解socket如何封装成request(下)
Tomcat原理系列之七:详解socket如何封装成request(下)
Tomcat原理系列之七:详解socket如何封装成request(下)
|
缓存 Java 应用服务中间件
Tomcat原理系列之六:详解socket如何封装成request(上)
Tomcat原理系列之六:详解socket如何封装成request(上)
|
网络协议 Java
对于Java中Socket类的理解
对于Java中Socket类的理解
164 0