java自学之路-day20

JAVA20

网络编程

网络通信协议

l  计算机网络中的各个电脑可以互传数据

l  传输数据有一定的规则 就是网络协议

l  对数据的传输格式 速率 步骤都有规定

l  必须遵循规则才能传输数据

l  有很多种,最广泛的是TCP/IP和UDP

l  主要学习TCP/IP

TCP/IP协议的网络模型

l  应用层

应用程序的协议

l  传输层

使网络程序进行通信 UDP和TCP

l  网络层

TCP/IP核心层

l  链路层

光纤,网线驱动协议

IP地址和端口号

l  IP地址

  1. 计算机的唯一标识
  2. 以能够指定传输数据和发送数据
  3. 广泛使用的IPv4
  4. 在计算机中以四个字节的二进制数来表示
  5. 为了方便识别 将每个字节用十进制数表示 用.隔开 0-255
  6. IP地址需求越来越多 可能出现饱和
  7. 出现了IPv6
  8. 用16个字节表示
  9. 是IPv4的8*10的28次方倍 达到2的128次方个
  10. 解决了资源不够的问题
  11. 本机回环地址

127.0.0.1 代表本机地址

l  端口号

  1. IP地址可以连接到某个计算机
  2. 访问计算机中的某个程序
  3. 需要端口号
  4. 由操作系统进行分配
  5. 有两个字节组成16位的二进制数 0-65535
  6. 0-1024之前的不能用 因为已经被知名程序或网络服务占用
  7. 例如浏览器端口号 80

InetAddress类

l  表示互联网中的IP地址

l  Java.net.InetAddress

l  不可以实例化对象

l  静态方法获取

  1. Static InetAddress getLocalHost()
  2. 返回值是InetAddress对象
  3. 输出后是ip地址和主机名

l  其他静态方法

  1. String getHostAddress() 返回主机地址
  2. String getHostName()  返回主机名称

l  获取非本机的ip对象

  1. static InetAddress getByname(String hostNmae)
  2. 传递主机名获取ip地址对象

UDP协议

l  是传输层两个重要的高级协议之一

l  无连接通信协议

l  数据传输的两端不建立逻辑连接

l  发送端不会确认接收端是否存在 接收端也不会反馈是否收到数据

l  消耗资源小 通信效率高 常用于音频视频 普通数据的传输

l  例如视频会议 空间留言

l  即使丢失一两个数据包 也不会对接收结果产生太大影响

l  比如电脑视频同步只是会卡一点而已 并不会有太大影响

l  数据大小在64kb内

TCP协议

l  面向连接的是通信协议

l  提供了两台计算机之间可靠无差错的数据传输

l  必须明确客户端和服务端

l  每次连接需要“三次握手”

l  客户端发出连接请求 服务端反馈允许连接 客户端反馈连接成功

l  连接速度慢但是安全性高

l  被广泛采用

l  下载文件必须使用TCP

l  两台计算机

l

UDP通信

数据包和发送对象

l  两台计算机

l  一台发送一台接收

l  发送端需要知道接收方法ip和端口号

l  数据需要包装才能发送

DatagramPacket

l  包装数据 相当于码头的集装箱

l  封装数据 接收端的地址和端口

l  接收数据 绑定端口号和发送端一致

DatagramSocker

l  将包装好的数据发送/接收 相当于码头的作用

实现步骤

l  发送端创建DatagramPacket的对象 包装数据和设置接收端的地址和端口

  1. 构造方法传入参数

l  发送端创建DatagramSocker的对象 发送数据包

  1. 调用send方法传入DatagramPacket对象进行传递即可

l  发送端关闭资源 发送对象DatagramSocker

l  示例

l  接收端创建DatagramPacket的对象 绑定端口号

l  接收端创建字节数组加收发送来的数据

l  接收端创建DatagramSocker的对象 传入数组和数组长度

l  调用receive方法接收数据 传入参数 DatagramPacket的对象

l  拆包

发送的IP地址

接收的字节个数

发送方的端口号

l  关闭资源

l  示例

运行后没有结束 因为receive具有线程等待 会检测udp的发送 如果不发送数据就会一直在检测

拆包

但是数组长度太大造成浪费

所以调用DatagramPacket的getlength方法返回接收的数据长度

拆包IP地址

调用DatagramPacket的getAddress 获取到发送端的IP对象

通过这个对象就能得到IP地址和主机名

拆包发送端端口号

调用datagramPacket的方法getport

TCP通信

l  有明确的客户端和服务器

l  服务端类 ServerSocket

l  客户端类 Scoket

l  客户端主动连接服务器

l  服务器提前启动等到客户端连接

l  客户端请求服务器

l  服务器同意连接

l  客户端和服务端形成一个通路 有一个对象就建立完毕了

l  这个对象就是IO流对象 字节流

l  可以进行数据交换

l  客户端输出 服务端输入 服务端输出 客户端输入

Scoket类

l  此类实现了客户端的套接字 套接字就是两台机器通信的端点

l  Java.net.Socket

l  构造方法

  1. Socket(Stringhost,int port)
  2. 传递服务器ip和端口号
  3. 构造方法只要运行就会和服务器进行连接 连接失败抛出异常
  4. OutputStream getOuputStream()返回套接字的输出流

将数据输出,输出到服务器

  1. InputStream getInputStream() 返回套接字的输入流

将数据输入,从服务端读取数据

  1. 示例

ServerScoket

l  此类实现了服务器端的套接字

l  构造方法

ServerScoket(int port)传递客户端要求的端口号

l  服务器需要知道谁连接上了服务器 因此需要获得服务器的套接字对象

l  获取方法

accept()返回客户端的套接字对象

l  示例

客户端和服务端交换数据

l  客户端

l  服务端

TCP中的流对象

ShutdownOutput

l  读网络流中的字节数组读不到-1

l  如果循环读取就会死循环

l  这是用到这个方法

l  禁用此套接字的输出流

l  如果调用了此方法就会抛出异常

l  Read遇到抛出异常就会返回-1

l  循环就停了下来

时间: 2024-10-17 15:58:55

java自学之路-day20的相关文章

【转】JAVA自学之路

JAVA自学之路 一: 学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向呢? 我的意见是,不要太过相信各种培训机构或是抢手文章的说法(包括我),当你要走向社会的时候,就不要再把自己当成学生,不要把自己的将来交给别人,学会运用自己的眼睛去观察,去了解这个世界吧. 每个培训机构都会宣传自己的好处,并不能说明大的趋势. 一些新闻文章很有可能是枪手写的,不必太过相信.国外背景的

[转载] JAVA自学之路

原文链接http://blog.csdn.net/mengxin846/article/details/2219844 虽然文章有点旧但还是有些启发的,譬如要事第一,好读书不求甚解. JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向呢? 我的意见是,不要太过相信各种培训机构或是抢手文章的说法(包括我),当你要走向社会的时候,就不要再把自己当 成学生

马士兵:JAVA自学之路

JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训.决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向呢?我的意见是,不要太过相信各种培训机构或是抢手文章的说法(包括我),当你要走向社会的时候,就不要再把自己当成学生,不要把自己的将来交给别人,学会运用自己的眼睛去观察,去了解这个世界吧. 每个培训机构都会宣传自己的好处,并不能说明大的趋势.一些新闻文章很有可能是枪手写的,不必太过相信.国外背景的教师和课

Java 自学之路

Java 自学之路 前言 从运行第一个程序开始算起,我接触编程也有三年的时间了.最初是从51单片机入门学习的C语言,班里面的大佬带着我一起做小项目,但是因为没人教,基本靠自学,学得慢,写的代码也烂,很没有章法.后来大三下半学期开始准备考研(从电子跨考计算机),从零开始学习数据结构,这才算是真正地入了编程的门.至于考研,后来就放弃了(别问我为什么放弃,当时脑子抽了),去了一家小公司实习.这家公司主要做机器视觉的项目,当时去面试的时候觉得挺高大上,技术 leader 也挺和蔼,感觉是很务实的一个团队

java自学之路-day17

JAVA17 多线程 进程和线程的概念 进程 l  正在运行中的程序 l  程序存储在硬盘中 当进入内存运行时 l  内存中的每一个程序就叫进程 l  并且每一个进程都有一个独立的功能 线程 l  迅雷中的多线程下载 l  main方法中有很多方法一次排列 如果其中一个方法执行了很多次循环 那么下一个方法就不会执行 从入口main到结束,一条路走到底 必须一个一个的执行 这种程序是单线程程序 效率慢 l  例如 多台电脑网吧上网 多条路通行 线程 概念 l  CPU 中央处理器 inter AW

Java自学之路---DotCom

引言 我从接触编程以来,一直是一个C/C++程序猿,因为我喜欢编程时,那种接地气的感觉,认为只有自己管理内存的使用,心理才踏实.但随着工作中不断增加的见闻,不断的从博客和源码中获得新的见解,我发现这个时代已经发生了变化,我们有强劲的硬件资源.我们有久经考验的框架和源码,我们最宝贵的是花在编码上的时间.所以我决定带着之前C/C++的经验,来认识JAVA是门怎样的语言,以及它的编程理念可以给我带来怎样的好处. 如何学习 和我学习其他语言一样,我主要还是依靠书本,电子书或者是纸质书,这样学习起来才是最

java自学之路-day16

JAVA16 IO流 转换流 引入 l  中文系统默认编码表GBK l  FileWriter的构造方法假定默认编码GBK l  但是一些文本文件有可能是其他编码方式 l  所以引入转换流 可以对编码表进行设定 l  对之后开发互联网程序很重要 概述 l  字符流的一种 l  字符与字节的桥梁 l  继承Writer类 OutputStreamWriter l  Java.io. OutputStreamWriter l  继承Writer类 l  字符输出流 向文本文件写入数据 l  字符流转

java自学之路-day18

数据库 数据库 概念 l  对于一串数据修改其中的一条数据 l  如果用io流就需要全盘读写 然后找到其中的一行 进行修改 l  或者使用数组进行修改 l  这样太复杂 效率慢 所以需要引用数据库 l  数据库本质是一个文件系统 可以看做是一个具有很好的处理数据能力的容器 和集合 数组 都一样 l  里面有严格的数据存储格式 l  数据库管理系统是用一个软件管理数据库 l  常见的数据库管理系统 MYSQL  开源免费 瑞典的公司开发 sun公司收购  Oracle收购了sun MYSQL6.x

java自学之路-day10

JAVA10 Eclipse快捷键补充 l  选中类Ctrl T 继承树 l  Ctrl 或者f3 查看源码 多态会跳转到调用父类中 l  Java中lang包中的所有类 不需要导包 直接用  例如 System String l  Ecplise 中的Jre System Library是默认的eclipse依赖jre的类库 在该位置可以查找到平常使用的String 类 Random类 Math类 l  Jdk 包括 jre和开发工具,jre包括jvm 和运行时所需要的核心类库 l  运行 h