计算机网络是两台或更多的计算机组成的网络,同一网络内的任意两台计算机可以直接通信,所有计算机必须遵循同一种网络协议。
UDP(UserDatagramProtocol)协议是数据报文协议,不面向连接,不保证可靠传输,由于UDP协议传输效率高,通常用来传输视频等能容忍丢失部分数据的文件。
Socket通常称为套接字,用于应用程序之间建立远程连接,Socket内部通过TCP/IP协议进行数据传输,可以简单的理解为对IP地址和端口号的描述。Socket接口是由计算机操作系统提供的,编程语言提供对Socket接口调用的封装。通常计算机同时运行多个应用程序,仅仅有IP地址是无法确定由哪个应用程序接收数据,所以操作系统抽象出Socket接口,每个应用程序对应不同的socket(每个网络应用程序分配不同的端口号)。端口号的范围是0~65535,小于1024的端口需要管理员权限,大于1024的端口可以任意用户的应用程序打开。
Java提供了Socket类ServerSocket类对计算机操作系统的Socket进行调用。客户端使用Socket(InetAddress,port)构造方法传入IP地址和端口号打开Socket,与远程服务区指定端口进行连接,然后调用socket的getInputStream和getOutputStream方法获取输入和输出流就可以读写TCP的字节流:
//连接远程服务器Socketsocket=newSocket(InetAddress,port);//读写字节流InputStreamin=socket.getInputStream();OutputStreamout=socket.getOutputStream();服务器端通过ServerSocket(port)构造方法传入端口号来监听指定的端口,然后通过accept()方法得到一个Socket对象与远程客户端建立连接,同样调用Socket对象的getInputStream和getOutputStream方法就可以读写字节流,服务器端完成传输后可以通过close()方法关闭远程连接和监听端口:
//监听端口ServerSocketserverSocket=newServerSocket(port);//建立远程连接Socketsocket=serverSocket.accept();//读写字节流InputStreamin=socket.getInputStream();OutputStreamout=socket.getOutputStream();//关闭连接socket.close();//关闭监听端口serverSocket.close();我们可以在本机做一个小实验,首先编写一个客户端的TCPClient类,通过Java提供的InetAddress类的getLoopbackAddress()方法获得localhost地址,然后使用Java的Socket类创建一个与本机8090端口的连接,再将读取字节流包装成一个BufferedReader对象、写入字节流包装成BufferedWriter对象。使用BufferedWriter写入一个“time”字符串并发送到本机的8090端口,再用BufferedReader读取本机8090端口返回的数据并打印出来。代码如下:
服务端的一个ServerSocket可以同时和多个客户端建立连接进行双向通信,实现起来也很简单,在设置好监听端口后,在一个无限for循环中调用ServerSocket的accept()方法,返回与客户端新建的连接,再启动线程或者使用线程池来处理客户端的请求,这样就可以同时处理多个客户端的连接,代码如下:
Java提供了一个javax.mail包,可以很方便的实现发送和接收邮件,而不用去关系SMTP协议和POP3协议的原理,方法如下:
HTTP协议(HyperTextTransferProtocol)又叫做超文本传输协议,它是基于TCP协议上的请求和响应协议,是目前使用最广泛的高级协议。最早的HTTP协议版本是HTTP1.0,每一次请求,都会创建一个TCP连接,由于浏览器打开网页通常会请求不同的资源(例如图片,CSS等其他资源),创建TCP连接会有一定耗时,所以传输效率比较低;HTTP1.1则做出改进,多个HTTP请求可以通过一个TCP连接完成,效率得到提高;HTTP2.0同样也是多个请求通过一个TCP连接完成,但是浏览器发送一个请求后不需要等待服务器的响应就可以立刻发送后续的请求,服务器只要有了响应数据立刻返回,不关心请求的顺序,也就是说HTTP2.0不需要严格按照收到请求再响应的方式进行。
HTTP服务器用于处理HTTP请求,发送HTTP响应。在Java中,HTTP服务器通过JAVAEE的ServletAPI定义,通常Servlet容器根据收到的HTTP请求信息创建一个Request对象,再创建一个Response对象用来向Web客户端发送响应,调用Servlet对象的service()方法处理Request和Response,具体参考Servlet教程。
HTTP客户端用于发送HTTP请求,接收HTTP响应。Java提供的java.net.HttpURLConnection类可以实现HTTP客户端功能: