Java网络编程

网络编程

  1. Java的网络通信非常简单,服务器端通过ServerSocket建立监听客户端通过Socket连接到指定服务器后,通信双方就可以通过IO流进行通信

  2. OSI模型:开放系统互连参考模型(Open System InterConnection),力求将网络简化,并以模块化的方式来设计网络。OSI模型计算机网络分成物理层数据链路层网络层传输层会话层表示层应用层7层。

  3. 通信协议:计算机网络中实现通信必须有一些约定,这些约定被称为通信协议。通信协议通常由三部分组成:一是语义部分,用于决定双方对话的类型;二是语法部分,用于决定双方对话的格式;三是变换规则,用于决定通信双方的应答关系。通信协议是网络通信的基础IP协议则是一种非常重要的通信协议。

  4. IP协议:又称互联网协议(Internet Protocol),是支持网间互联的数据报协议。它提供网间连接的完善功能,包括IP数据报规定互联网络范围内的地址格式。经常与IP协议放在一起的还有TCP协议,即传输控制协议(Transmission Control Protocol),它规定一种可靠数据信息传递服务。实际使用中常常把这两个协议统称为TCP/IP协议,TCP/IP协议最早出现在UNIX操作系统中,现在几乎所有的操作系统都支持TCP/IP协议。因此TCP/IP协议是Internet中最常用的基础协议。

  5. 按TCP/IP协议模型,网络通常被分为一个四层模型,对应关系如图。

  6. IP地址:用于唯一地标识网络中的一个通信实体,这个通信实体既可以是一台主机,也可以是一台打印机,或者是路由器的某一个端口。而在基于IP协议网络中传输的数据包,都必须使用IP地址进行标识IP地址是数字型的,IP地址是一个32位(32bit)整数,但通常为了便于记忆,通常把它分成4个8位的二进制数,每8位之间用圆点隔开,每个8位整数可以转换成一个0~255的十进制整数,因此我们看到的IP地址常常是这种形式:202.9.128.88。IP地址用于唯一地标识网络上的一个通信实体,但一个通信实体可以有多个通信程序同时提供网络服务,此时还需要使用端口

  7. 端口:端口是一个16位的整数,用于表示数据交给哪个通信程序处理。因此,端口就是应用程序与外界交流的出入口,它是一种抽象的软件结构,包括一些数据结构和I/O(基本输入/输出)缓冲区。不同的应用程序处理不同端口上的数据,同一台机器不能有两个程序使用同一个端口,端口号可以从0到65535,通常将它分为如下三类。

    • 公认端口(Well Known Ports):从0到1023,它们紧密绑定(Binding)一些特定的服务。
    • 注册端口(Registered Ports):从1024到49151,它们松散地绑定一些服务。应用程序通常应该使用这个范围内的端口。
    • 动态和/或私有端口(Dynamic and/or PrivatePorts):从49152到65535,这些端口是应用程序使用的动态端口,应用程序一般不会主动使用这些端口。
  8. Java为网络支持提供了java.net包,该包下的URL和URLConnection等类提供了以编程方式访问Web服务的功能,而URLDecoder和URLEncoder则提供了普通字符串和application/x-www-form-urlencoded MIME字符串相互转换的静态方法。

  • InetAddress类代表IP地址。InetAddress类本身并没有提供太多功能,它代表一个IP地址对象,是网络通信的基础。InetAddress类没有提供构造器,而是提供了如下两个静态方法获取InetAddress实例。

  • URLDecoderURLEncoder用于完成普通字符串和application/x-www-form-urlencoded MIME字符串之间的相互转换。

    • application/x-www-form-urlencoded MIME字符串:当URL地址里包含非西欧字符的字符串时,系统会将这些非西欧字符串转换成特殊字符串,就是所谓的application/x-www-form-urlencoded MIME字符串。编程过程中可能涉及普通字符串和这种特殊字符串的相关转换,这就需要使用URLDecoder和URLEncoder类。
    • 仅包含西欧字符的普通字符串和application/x-www-form-urlencoded MIME字符串无须转换,而包含中文字符的普通字符串则需要转换,转换方法是每个中文字符占2个字节每个字节可以转换成2个十六进制的数字,所以每个中文字符转换成“%XX%XX”的形式。当然,采用不同的字符集时,每个中文字符对应的字节数并不完全相同,所以使用URLEncoder和URLDecoder进行转换时也需要指定字符集。

  • URL(Uniform Resource Locator)对象代表统一资源定位器,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂对象的引用,例如对数据库或搜索引擎的查询。在通常情况下,URL可以由协议名主机端口资源组成,即满足如下格式:

    protocol://host:port/resourceName
    

    例如如下的URL地址:

    http://www.crazyit.org/index.php
    
    • 提示:JDK中还提供了一个URI(Uniform Resource Identifiers)其实例代表一个统一资源标识符,Java的URI不能用于定位任何资源,它的唯一作用就是解析。与此对应的是, URL则包含一个可打开到达该资源的输入流,我们可以将URL理解成URI的特例。

    URL类提供了多个构造器用于创建URL对象,一旦获得了URL对象之后,就可以调用如下方法来访问该URL对应的资源

    • URLConnection openConnection():返回一个URLConnection对象,它代表了与URL所引用的远程对象的连接。

    • InputStream openStream():打开与此URL的连接,并返回一个用于读取该URL资源InputStream。URL对象提供的openStream()方法可以读取该URL资源的InputStream,通过该方法可以非常方便地读取远程资源——甚至实现多线程下载

    • URLConnection和HttpURLConnection对象,其中前者表示应用程序和URL之间的通信连接,后者表示与URL之间的HTTP连接。程序可以通过URLConnection实例向该URL发送请求读取URL引用的资源

    通常创建一个和URL的连接,并发送请求、读取此URL引用的资源需要如下几个步骤。

    (1)通过调用URL对象的openConnection()方法来创建URLConnection对象。

    (2)设置URLConnection的参数和普通请求属性。

    (3)如果只是发送GET方式请求,则使用connect()方法建立和远程资源之间的实际连接即可;如果需要发送POST方式的请求,则需要获取URLConnection实例对应的输出流发送请求参数

    (4)远程资源变为可用,程序可以访问远程资源的头字段或通过输入流读取远程资源的数据。

posted @ 2022-06-05 09:48  大于昨天  阅读(67)  评论(0编辑  收藏  举报