*
* 网络编程中几个知识点:
*
* 1、网络模型:具体的通讯方式,
*
* OSI模型:七层
*
* TCP/IP模型:简化了OSI模型,共四层;
* 主机至网络层,
* 网际层(常见IP协议),
* 传输层(常见UDP协议和TCP协议),
* 应用层(常见http协议和ftp协议);
*
* 2、网络通讯三要素:
* IP ; 端口 ; 传输协议(常见UDP协议和TCP协议);
*
* IP:即指示具体的主机,可以用主机名代替表示,方便记忆;
* 特殊的IP地址:127.0.0.1 , 192.168.1.0 , 192.168.0.255;
*
* 端口:范围 0~65535(两个字节),0~1024 被系统保留;
*
* UDP协议的特点:面向无连接;速度快;不可靠,数据易丢失;数据被封包一次只能传输64k;
* TCP协议的特点:对方必须在线;数据可靠;可以直接大量数据的传输,不用封包;
* 通过三次握手机制来确认对方是否在线;
*
* 3、Java中的封装:
*
* IP的封装: IP地址封装:InetAddress ;
*
* UDP的封装:
* 套接字:DatagramSocket; (发送端与接收端原理一致)
* 数据包:DatagramPacket;
*
* TCP的封装:
*
* 客户端套接字: Socket;
* 服务器套接字: ServerSocket;
*
* 域名的封装:
* 统一资源定位符: URL;
* 程序与URL之间的通讯连接: URLConnection;
*
*
* 4、各封装中的方法:
*
* IP的封装:
*
* InetAddress: 因为无构造函数,故指定静态方法获取该类对象;
* 获取主机指定IP的InetAddress对象方法: getLocalHost(); getByName(String); getAllByName(String),这个方法返回一个字符串数组; UnknownHostException;
* 通过IP对象获取其封装的IP地址和主机名: getHostAddress(); getHostName();
*
* UDP协议的封装:
*
* DatagramSocket:
* 发送数据包:send(DatagramPacket p);
* 接受数据包:receive(Datagrampacket p); 阻塞式方法;
* 其他:connect(para); close();
* DatagramPacket:
* 用来发送数据包的构造函数:DatagramPacket(byte[] buf, int length, InetAddress address, int port) ;
* 用来接受数据包的构造函数:DatagramPacket(byte[] buf, int length) ;
* 获取该数据包发送端的IP地址对象: InetAddress getAddress() ;
* 获取数据包的数据: byte[] getData();
*
*
* TCP协议的封装:关键特点,面向有连接;必须对方在线;否则会发生ConnectException
*
* Socket(客户端): 初始化要指定主机和其端口,
* 构造函数:Socket() ; Socket(InetAddress address, int port) throw IOException
* 连接到指定服务器:connect(SocketAddress endpoint) ; 注意,其中SocketAddress对象是把IP和Port捆在一起了;
* 获取网络流中的输入流对象和输出流对象:getInputStream();getOutputStream();
* 关闭网络流中的输入流对象和输出流对象:showdownInput();showdownOutput();
* 获取该套接字的IP地址对象:getInetAddress();
* 其他 :close();
*
* ServerSocket(服务器):初始化必须要指定接收的端口;
* 构造函数:ServerSocket(int port) ; ServerSocket(int port, int backlog) ; 注意,backlog 是指可以连接上的最大客户端个数;
* 获取客户端对象:accept(); 阻塞式方法;
* 其他:close();可选操作;
*
* 域名的封装:
*
* URL
* 构造函数:URL(String spec) ; URL(String protocol, String host, int port, String file) ;
* 获取域名信息:获取协议名 getProtocol(); getHost() ; getPort(); getPath() ; getFile(); getQuery();
* 打开域名连接到指定主机: openConnetion() 返回的是URLConnection对象 ;
* 直接打开流对象:openStream();
*
* URLConnect 其实这个底层是封装了Socket对象以及应用层的协议的对象了的,所以才会有向服务端发送请求的方法;
* 获取到连接中的流对象 getInputStream(); getOutputStream();
*
*
*
* 5、注意:
* (1)发送端或客户端,发送数据或初始化时一定要指定具体主机的具体端口;
* 接收端或服务器,初始化时,一定要初始化端口,否则接收不到;
* (2)TCP协议的封装中的发送字符流的数据常使用流对象 PrintStream 或者 PrintWriter中的println方法;
* 能自动刷新和自动换行;一定要定义true参数;如果单独用缓冲区,就要加换行和刷新动作;
* (3)注意在用字符流缓冲区对象时,readLine方法读出来的内容里不含有结束标记,也就没有换行标记了,
* 即 一个数据在不是直接从文件中读出而直接进行第二次读取就会导致无法找到结束标记;
* 注意用shutdownOutput()方法来定义一个结束标记;
* (4)一般最好养成这样的习惯,就是在服务器中,要定义获取客户端主机名或地址的语句;
*
*
* */