1、JAVA讲座,网络编程,TCP/IP协议,TCP/IP是一个协议族,不是一个协议。它包括3个最主要的协议。 IP 是基础 TCP 可靠的有连接服务 UDP 不可靠的无连接服务,协议作用,IP:把包从一个IP地址送到另一个IP地址 主要解决路由的问题。不可靠。 UDP:把报文从一个IP+port送到另一个IP+port 主要解决的问题是,区分了端口,就是socket。无连接,不可靠,高效率 TCP:把报文从一个IPport送到另一个 IPport 主要解决的问题是可靠性问题,有连接。可靠。,协议分层,物理层,链路层,IP层,TCP/UDP,高层,TCP/IP 的分层,OSI参考模型,Socket
2、,Socket就是插座 同一个机器上有许多进程,好比同一个大楼住很多人 绑定到端口 实质就是抢占一个端口 一个端口只能分配给一个进程 Socket有时也叫port,AC类IP地址格式,1,Bits:,0Network,Host,Host,Host,8,9,16,17,24,25,32,Range (1-126),1,10Network,Network,Host,Host,8,9,16,17,24,25,32,Range (128-191),1,110Network,Network,Network,Host,8,9,16,17,24,25,32,Range (192-223),Bits:,Bit
3、s:,网络掩码(mask),网络掩码的作用 根据网络掩码+IP地址可确定该主机的网络地址 网络掩码的组成 对每个网络的网络地址设定一个按位对应的32 bit 的二进制数:网络地址部分的对应位设置位1,主机地址部分的对应位设置位 0 A类网络掩码:255.0.0.0 B类网络掩码:255.255.0.0 C类网络掩码:255.255.255.0,特殊的IP地址,对于本地计算机(就是你正在使用的那台计算机),有三种方法标识它: 用主机名标识:localhost 用IP地址标识:127.0.0.1 本机的真实IP地址 局域网的广播地址 网络地址.主机地址全是1 例如192.168.0.255,jav
4、a中支持网络的类,面向IP层的类: InetAddress 面向应用层的类: URL、URLConnection 面向网络层的类: TCP协议相关类: Socket、ServerSocket UDP协议相关类: DatagramPacket、DatagramSocket、MulticastSocket 可能产生的例外: BindException、ConnectException、MalformedURLException、NoRouteToHostException、ProtocolException、SocketException、UnknownHostException、UnknownS
5、erviceException,InetAddress,特点: 类InetAddress可以用于标识网络上的硬件资源,它提供了一系列方法以描述、获取及使用网络资源。 InetAddress类没有构造函数,因此不能用new来构造一个InetAddress实例。通常是用它提供的静态方法来获取 方法: public static InetAddress getByName(String host) public static InetAddress getLocalHost() public static InetAddress getAllByName(String host),URL,URL是统
6、一资源定位符(Uniform Resource Locator)的简称,它表示Internet上某一资源的地址。Internet上的资源包括HTML文件、图象文件、声音文件、动画文件以及其他任何内容(并不完全是文件,也可以是一个对数据库的查询等)。 通过URL,就可以访问Internet。浏览器或其他程序通过解析给定的URL就可以在网络上查找相应的文件或其他资源。,使用URL,一个URL对象生成后,其属性是不能被改变的,但可以通过它给定的方法来获取这些属性:public String getProtocol():获取该URL的协议名 public String getHost() :获取该UR
7、L的主机名 public String getPort() :获取该URL的端口号 public String getPath() :获取该URL的文件路径 public String getFile() :获取该URL的文件名 public String getRef() :获取该URL在文件中的相对位置 public String getQuery() :获取该URL的查询名,从URL读取,通过URL类提供的方法openStream(),就可以读取一个URL对象所指定的资源。 public final InputStream openStream() 方法openStream()与指定的U
8、RL建立连接并返回一个InputStream对象,将URL位置的资源转成一个数据流。通过这个InputStream对象,就可以读取资源中的数据。,URL,InputStream,某资源,应用程序,TCP通信,在Java中,基于TCP协议实现网络通信的类有两个:在客户端的Socket类和在服务器端的ServerSocket类。在服务器端通过指定一个用来等待的连接的端口号创建一个 ServerSocket实例。在客户端通过规定一个主机和端口号创建一个 socket实例,连到服务器上。ServerSocket类的accept方法使服务器处于阻塞状态,等待用户请求。,打电话的流程,服务器端,客户端,进
9、入待机状态,拔号,请求建立连接,摘机,接受主叫方的请求,进入通话状态,进入通话状态,TCP工作流程,服务器端,客户端,创建 ServerSoket,进入监听状态,创建 Socket 自动呼叫 ServerSoekt,自动接受,返回一个可工作Socket,成为一个可工作Socket,请求建立连接,接受请求,建立连接,理解服务器与客户端的概念,服务器与客户端的概念是角色上的区别 角色只在建立连接的过程中有区别 一旦建立了连接,双方对等通信,没有服务器与客户端的区别,通信过程,连接建立后,双方都持有一个Socket对象。 该对象提供InputStream,OutputStream。读写这两个对象即可
10、,Socekt,Socekt,InputStream,OutStream,InputStream,OutStream,TCP工作原理,Server,服务器方创建ServerSocket 客户方创建普通Socket 客户方呼叫服务方 服务方应答,并创建普通Socket 服务方的ServerSocket继续侦听其它的呼叫,Client,ServerSocket,ServerSocket作用是什么? 侦听,等待呼叫 ServerSocket应使用哪个端口号? 它的端口号必须公开,以便呼叫 Serversocket职责只做“搭桥”,不做具体的通信工作。,普通Socket,两个普通Socket间的通信是
11、对等的关系 每方持有两根管子,一个用于输入,一个用于输出,Socket A,Socket B,普通Socket,普通Socket使用哪个端口号? 随便哪个,对方不需要事先知道。 怎样保证发送是正确的? 发送后等待对方确认,重发,直到正确或者超时错误。,使用多线程,一边从键盘读入,一边发送,一边显示 inputStream的读入是阻塞过程,键盘,Socket,屏幕,UDP通信,UDP协议是无连接的协议,它以数据报作为数据传输的载体。数据报是一个在网络上发送的独立信息,它的到达、到达时间以及内容本身等都不能得到保证。数据报的大小是受限制的,每个数据报的大小限定在64KB以内。 UDP协议无需在发送方和接收方建立连接,但也可以先建立连接。数据报在网上可以以任何可能的路径传往目的地。 用于表达通信数据的数据报类DatagramPacket 用于进行端到端通信的类DatagramSocket,UDP原理图,client,server,Datagram packet,Datagram packet,Datagram packet,可能存在的问题: 1.丢包 2.乱序 3.错包 4.重复包,UDP与TCP比较,TCP可靠,UDP不可靠 TCP 慢,UDP 快 TCP好比打电话,UDP好比发电报 TCP适合Internet环境,UDP适合局域网环境,