网络编程
网络编程简介
将地理位置不同,具有独立功能的多台计算机连接在一起就形成了网络,从而这多台计算机具有了通信功能,所以为网络创造了一系列的通信协议。在整个通信过程中往往会分为两种端口:服务端和客户端,所以围绕着服务端和客户端的程序开发就有了两种模式
**C/S(Client/Server)😗*要开发两套程序(服务端和客户端),这种模式在进行维护的时候需要维护两套程序,而且客户端的程序更新也必须及时,此类程序安全性高;
**B/S(Browser/Server)😗*只需针对服务器开发一套程序,客户端使用浏览器进行访问。这种程序在日后进行程序维护的时候只需要维护服务端就可以,客户端不需要做任何修改。此类程序使用公共端口,包括公共协议,所以安全性很差。
下面总结的是C/S结构的程序两种实现:TCP模型和UDP模型。
Echo程序模型
Echo的程序模型的基本思想在于,客户端通过键盘输入一个信息,把此信息发送给服务器端后,服务器端会将此信息反馈给客户端进行显示,本操作只要通过java.net包的两个类实现:
- ServerSocket类:封装TCP协议类,工作在服务器端。
- Socket类 :封装TCP协议的操作类,每一个Socket对象都表示一个客户端。
ServerSocket类常见方法:
方法 | 类型 | 描述 |
---|---|---|
public ServerSocket(int port) throws IOException | 构造 | 开辟一个指定的端口监听,一般使用5000以上 |
public Server accept() throws IOException | 普通 | 服务器端接收客户端请求,通过Socket返回 |
public void close() throws IOException | 普通 | 关闭服务器 |
Socket类常见方法:
方法 | 类型 | 描述 |
---|---|---|
public Socket(String host ,int port) throws UnknownHostExcetion,IOException | 构造 | 指定要连接的主机(IP地址)和端口 |
public OutputStream getOutputStrea() throws IOException | 普通 | 取得指定客户端的输出对象,使用的时候肯定使用PrintStream装饰操作 |
public InputStream getInputStream() throws IOException | 普通 | 从指定的客户端读取数据,使用Scanner操作 |
Echo通信模型的实现需要通过ServerSocket类在服务器端定义数据监听端口,在没有客户端连接时将一直处于等待连接状态。每一个客户端连接到服务器端后都通过Socket实例描述,通过Socket可以获取客户端输入流与输出流实例,这样就可以利用I/O实现通信。
BIO处理模型
基于单线程(主线程)的处理机制实现的网络通信,这样就会造成一个问题,在同一段时间只允许有一个客户端连接到服务器端进行通信处理,而且当次客户端退出后服务器端也将随之关闭。所以为了提升服务器端的处理性能 ,则可以利用多线程来处理多个客户端的通信需求。
将每一个客户端的Socket实例封装在一个线程中,这样一个服务器端就可以同时处理多个客户端请求。
但是虽然使用多线程修改了服务器端处理模式,但是在程序开发中并没有对服务器端可以用的线程数量进行限制,这也就意味着如果并发客户端访问量增加,则服务器端将会出现严重的性能问题。所以在JDK1.4以前就必须对线程数量进行有效控制,需要追加客户端连接等待机制才可以正常使用,这样的开发操作就是BIO模式(Blocking IO,阻塞IO)模式。
UDP程序
TCP的所有操作都必须建立可靠的连接才能通信,但这种做法肯定会浪费大量的系统性能,为了减少这种开销,在网络中又提供了UDP传输协议(不可靠连接),即利用数据报的形式进行数据发送,由于没有建立可靠连接,此时接收端可能处于关闭状态,所以利用UDP发送的数据,客户端不一定接收到。
方法 | 类型 | 描述 |
---|---|---|
public DatagramPacket(byte[] buf,int length) | 构造 | 实例化DatagramPacket对象时指定接收数据长度 |
public DatagramPacket(byte[] buf,int length) | 构造 | 实例化DatagramPacket对象时指定发送的数据、数据的长度、目标地址及端口 |
public byte[] getData() | 普通 | 返回接收的数据 |
public int getLength() | 普通 | 返回要发送或接收数据的长度 |
方法 | 类型 | 描述 |
---|---|---|
public DatagramPacket(int port) throws SocketException | 构造 | 创建DatagramSocket对象,并指定监听的端口 |
public void send(DatagramPacket P) throws IOException | 普通 | 发送数据报 |
public void receive(DatagramPacket P) throws IOException | 普通 | 接收数据报 |
在进行UDP客户端编写时需要设置一个客户端的监听端口,接收到的数据信息可以利用DatagramPacket 类对象进行接收,这样在客户端打开的情况下会自动接收到服务器端发送来的信息。
总结
服务器端
- 利用ServerSocket开辟一个端口监听
- 再利用ServerSocket.accept()方法接收客户端发出的请求,并且返回值是Socket
- 然后利用返回的Socket类型实现io流(InputStream getInputStream)
- 最后关闭ServerSocket:ServerSocket.close()
客户端
- 利用socket指定要连接的主机和端口
- 实现io流(OutputStream getOutputStream)
- 最后关闭socket连接:socket.close()