------- android培训、java培训、期待与您交流! ----------
网络编程
▸ 概述
▸ 步骤 • 找到对方IP • 数据要发送到对方指定的应用程序上,为了表示这些程序,用数字进行标示 该数字叫做端口/逻辑端口,一个应用程序可以对应多个 • 定义通信规则,成为协议 国际组织定义的通用协议TCP/IP,广域/局域网通用 IPX/SPX/NetBIOS 局域网 为了安全,很多组织或单位都有自己特定的协议 ▸ 网络模型:层次的细致划分 • OSI参考模型:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层 • TCP/IP参考模型:主机至网络层,网际层(IP),传输层(TCP/UDP),应用层(应用,表示,会话)(HTTP/FTP) • JavaWeb开发:应用层 网络编程:网际层,传输层 ▸ 网络通讯要素 • IP地址 • 端口:数字 0~65535 0~1024:系统程序保留 web:80 • 传输协议
▸ IP
IPDemo.java • 不易记忆,可用主机名 localhost 127.0.0.1 本地回环地址 ▸ InetAddress 描述IP地址的类 • InetAddress i = InetAddress.getLocalHost(); UnknownHostException • getHostName() • InetAddress is = InetAddress.getByName(“***.***.***.***”); 如果地址和对应的主机名没有在网络上,则解析不成功,名字还是IP地址 • 有可能不止一个主机地址 getAllByName()
▸ TCP和UDP
▸ UDP:面向无连接 • 将数据及源和目的封装在数据包中,不需要建立连接 • 数据包大小限制在64K内 • 不可靠协议 • 不需要建立连接,速度快 ▸ TCP:面向连接 • 建立连接形成数据传输通道,进行大量数据传输 • 三次握手,可靠协议 • 必须建立连接,效率稍低
▸ Socket 套接字
• 通信的两端就是Socket,数据在Socket间通过IO传输 ▸ UDP Socket UDPDemo.java • DatagramSocket 数据 • DatagramPacket 数据报包 ▸ 发送一段文字数据 • 建立UDPSocket服务 • 提供数据,将数据封装到数据包中 • 通过Socket服务的发送功能发送 • 关闭资源 ▸ 接收方 • 定义UDPSocket服务,通常会监听一个端口 • 定义数据包用于存储接收到的字节数据 数据包中有不同方法可以提取不同数据信息 • 通过Socket服务的receive方法存入数据 receive()是阻塞式方法 ▸ 通过数据包对象的特有功能提取信息 • getAddress().getHostAddress() • getData() • getLength() • getPort() • 关闭资源 • 用键盘输入 UDPDemo2.java BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); • 192.168.1.255 广播地址 192.168.1.0 网络地址 • 聊天程序 ChatDemo.java 因为收发动作不一致所以要定义两个run方法,而且要封装到不同的类中 ▸ TCP Socket TCPDemo.java TCPDemo2.java ▸ 客户端:Socket • 对象建立时就可连接指定主机 • 建立Socket时要求有服务端存在并连接成功 连接后会有通路流进行数据传输 ▸ 步骤 • 创建Socket,指定目的主机和端口 • 获取输出流 getOutputStream() • 输出 • 获取输入流,读取服务端反馈 • 关闭客户端资源 ▸ 服务端:ServerSocket • 建立ServerSocket服务,监听一个端口 • 用accept方法获取连接过来的客户端对象,阻塞式 • 使用对应客户端的读取流读取发过来的数据 • 关闭服务端(可选) ▸ 练习:文本转换服务器,服务端把文本转换为大写返回给客户端 TransTextDemo.java ▸ 客户端 • 用IO的操作规律思考 • 源:键盘录入 • 目的:网络输出流 • 文本数据:字符流 • 提高效率:缓冲 ▸ 步骤 • 建立服务 • 获取键盘录入 • 发送数据,需要刷新缓冲,需要发送回车符,因为readLine()方法需要接收回车 • 获取返回的大写数据 • 关闭资源 over时,退出循环,s.close()运行,返回-1;服务器端收到-1也退出循环 ▸ TCP复制文件 UploadText.java ▸ 需要结束标记 • 自定义结束标记:不好,如果文件中如果有重复字符会提前结束 out.println(“over”); • 自定义时间标记 long l = System.currentTimeMillis(); dos.writeLong(l); • Socket自带方法:s.shutDownOutput() 相当于给流中写入一个结束标记-1