[疯狂Java讲义精粹] 第十二章|网络编程
1. 网络编程基础知识1.1 网络基础知识0. 网络分类:
- 按规模大小和延伸范围分: 局域网(LAN), 城域网(MAN), 广域网(WAN). 按网络的拓扑结构分: 星型网络, 总线网络, 环线网络, 树型网络, 星型环线网络等. 按传输介质: 双绞线网, 同轴电缆网, 光纤网, 卫星网等.
1. 计算机网络中实现通信必须有一些约定, 这些约定被称为通信协议. 通信协议负责对传输速率, 传输代码, 代码结构, 传输控制步骤, 出错控制等制定处理标准.
2. 通信协议由三部分组成:
- 语义部分: 用于决定双方对话的类型. 语法部分: 决定双方对话的格式. 变换规则: 决定应答关系.
3. OSI七层模型:
- Open System Interconnection, OSI, 开放系统互联参考模型. OSI把网络分成七层: 物理层, 数据链路层, 网络层, 传输层, 会话层, 表示层, 应用层.
TCP协议(Transmission Control Protocol), 传输控制协议, 它规定一中可靠地数据信息传递服务. IP协议(Internet Protocol), 互联网协议, 是支持网间互联的数据报协议. 1. 端口用于表示数据交给哪个通信程序处理, 所以端口就是应用程序与外界交流的出入口. 2. Java的基本网络支持Java为网络支持提供了java.net包, 该包下的URL和URLConnection等类提供了一编程方式访问Web服务的功能, 而URLDecoder和URLEncoder提供了普通字符串和application/x-www-form-urlencoded MIME字符串互相转换的静态方法. 2.1 使用InetAddress0. Java使用InetAddress类代表IP地址, 有Inet4Address, Inet6Address两个子类.
1. InetAddress没有构造器, 而有两个静态方法获取InetAddress实例:
- getByName(String host): 根据主机获取对应的InetAddress对象. getByAddress(byte[] addr): 根据原始IP地址获取对应的InetAddress对象.
2. 三个方法获取InetAddress实例对应的IP地址和主机名:
- String getCanonicalHostName(): 获取此IP地址的全限定域名. String getHostAddress(): 返回该InetAddress实例对应的IP地址字符串(以字符串形式). String getHostName()
- URLDecoder类包含一个decode(String s, String enc)静态方法, 将看上去乱码的特殊字符串转成普通字符串. s是要操作的字符串, enc是编码方式(如"GBK"). URLEncoder类包含一个encode(String s, String enc)静态方法, 把普通字符串转成applicatio/x-www-form-urlencoded MIME字符串.
1. URL的方法:
- String getFile(): 获得该URL的资源名. String getHost(). String getPath(). int getPort(). Strinig getProtocol(). String getQuery(): 获取该URL的查询字符串部分. URLConnection openConnection(): 返回一个URLConnection对象, 代表与URL所引用的远程对象的连接. InputStream openStream(): 打开于此URL的连接, 并返回一个用于读取该URL资源的InputStream.
1. IP协议不能结局传输过程中可能出现的问题, 用TCP协议来提供可靠并且无差错的通信服务.
2. 两台计算机连接时, TCP协议会让他们建立一个用于发送和接收数据的虚拟链路. TCP协议负责收集这些信息包, 并按次序传送, 接收端收到后再将它们正确还原. TCP保证数据包在传送中准确无误. TCP使用重发机制(发送信息后, 需要受到另一个通信实体的确认信息, 没有收到则重发.). 3.2 使用ServerSocket创建TCP服务器端0. Java中能接受其他通信实体连接请求的类是ServerSocket, ServerSocket对象用于监听来自客户端的Socket连接(如果没有连接, 将一直处于等待状态).
1. ServerSocket的构造器:
- ServerSocket(int port): 用指定端口port创建一个ServerSocket. ServerSocket(int port, int backlog): 增加一个用来改变连接队列长度的参数backlog. ServerSocket(int port, int backlog, InetAddress loaclAddr): 在及其存在多个IP地址的情况下, 允许通过localAddr参数指定将ServerSocket绑定到指定的IP地址.
2. ServerSocket使用完毕后, 使用ServerSocket的close()方法关闭.
3. ServerSocket包含一个监听来自客户端连接请求的方法: Socket accept(): 如果接收到一个客户端Socket的连接请求, 返回一个与客户端Socket对应的Socket; 否则该方法一直处于等待状态, 线程也被阻塞. 3.3 使用Scocket进行通信0. java.util.Socket的构造器:
- Socket(InetAddress/String remoteAddress, int port): 创建连接到指定远程主机, 远程端口的Socket, 没有指定本地地址和端口, 默认使用本地主机的默认IP地址和系统动态分配的端口.
示例:
import java.net.*;import java.io.*;public class Client{public static void main(String[] args)throws IOException{Socket socket = new Socket("127.0.0.1", 30000);BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = br.readLine();System.out.println("#FROM SERVER: " + line);br.close();socket.close();}}3.4 加入多线程0. 服务器端应为每个Socket连接启动一个线程. 1. 客户端读取服务器端的数据的线程同样会被阻塞, 所以应该单独启动一个线程负责读取服务器端的数据. 3.5 记录用户信息* 3.4 和 3.5讲C/S结构聊天室怎么写. 3.6 半关闭的Socket0. 要表示输出已经结束可以通过关闭输出流来实现, 但是在网络通信中如果关闭输出流, 则对应的Socket也将随之关闭, 这样导致程序无法从该Socket的输入流中读取数据.
1. Socket低通两个瓣关闭的方法, 只关闭Socket的输入流或者输出流, 用以表示输出数据已经发送完成:
- shutdownInput(): 关闭该Socket的输入流, 程序还可以通过该Socket的输出流输出数据. shutdownOutput().
# AIO聊天工具.
----------------------------------------挖坑不填----------------------------------------