java套接字编程
本教程是Java套接字编程的简介,从一个简单的客户机-服务器示例开始,该示例演示了Java I / O的基本功能。 将向您介绍原始的java.io
软件包和NIO,即Java 1.4中引入的非阻塞I / O(java.nio
)API。 最后,您将看到一个示例,该示例演示了在NIO.2中从Java 7向前实现的Java网络。
套接字编程可归结为两个相互通信的系统。 通常,网络通信有两种形式:传输控制协议(TCP)和用户数据报协议(UDP)。 TCP和UDP用于不同目的,并且都有独特的约束:
- TCP是相对简单且可靠的协议,它使客户端可以连接到服务器,并使两个系统进行通信。 在TCP中,每个实体都知道已收到其通信有效载荷。
- UDP是一种无连接协议 ,适用于不一定需要每个数据包到达其目的地的情况,例如媒体流。
要了解TCP和UDP之间的区别,请考虑如果您从自己喜欢的网站流式传输视频并且丢帧了会发生什么情况。 您是希望客户端放慢影片的速度来接收丢失的帧,还是希望视频继续播放? 视频流协议通常利用UDP。 因为TCP保证传送,所以它是HTTP,FTP,SMTP,POP3等的首选协议。
在本教程中,我向您介绍Java中的套接字编程。 我提供了一系列客户机/服务器示例,这些示例演示了原始Java I / O框架中的功能,然后逐步推进使用NIO.2中引入的功能。
老式Java套接字
在NIO之前的实现中,Java TCP客户端套接字代码由java.net.Socket
类处理。 以下代码打开与服务器的连接:
Socket socket = new Socket( server, port );
一旦我们的socket
实例连接到服务器,我们就可以开始获取到服务器的输入和输出流。 输入流用于从服务器读取数据,而输出流用于将数据写入服务器。 我们可以执行以下方法来获取输入和输出流:
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
因为这些是普通流,所以我们将使用它们从文件中读取和写入文件,因此可以将它们转换为最适合我们用例的形式。 例如,我们可以将OutputStream
与PrintStream
包裹在一起,以便我们可以轻松地使用诸如println()
类的方法编写文本。 再举一个例子,我们可以通过InputStream
用BufferedReader
包装InputStreamReader
,以便使用readLine()
类的方法轻松读取文本。