java 知识总结(十三)网络编程:这篇文章简单总结一下 java 网络编程的相关知识
一、TCP 和 UDP
1.TCP(传输控制协议) 方式
TCP 方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据
2. UDP(用户数据报协议) 方式
UDP 方式就类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得
这两种传输方式都是实际的网络编程中进行使用,重要的数据一般使用 TCP 方式进行数据传输,而大量的非核心数据则都通过 UDP 方式进行传递,在一些程序中甚至结合使用这两种方式进行数据的传递。由于 TCP 需要建立专用的虚拟连接以及确认传输是否正确,所以使用 TCP 方式的速度稍微慢一些,而且传输时产生的数据量要比 UDP 稍微大一些。
总结一下 UDP 和 TCP 协议的区别
–使用 UDP 时,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。
–对于 TCP 协议,由于它是一个面向连接的协议,在 socket 之间进行数据传输之前必然要建立连接,所以在 TCP 中多了一个连接建立的时间
–使用 UDP 传输数据时是有大小限制的,每个被传输的数据报必须限定在 64KB 之内。
–TCP 没有这方面的限制,一旦连接建立起来,双方的 socket 就可以按统一的格式传输大量的数据。
–UDP 是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
–TCP 是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据
–TCP 在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输。
–相比之下 UDP 操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中 client/server 应用程序
二、基于 URL 的网络编程
1. 创建一个 URL
为了表示 URL, java.NET 中实现了类 URL。我们可以通过下面的构造方法来初始化一个 URL 对象:
(1)public URL (String spec);
通过一个表示 URL 地址的字符串可以构造一个 URL 对象
URL urlBase=new URL("http://www. 263.Net/")
(2)public URL(URL context, String spec);
通过基 URL 和相对 URL 构造一个 URL 对象。
URL net263=new URL ("http://www.263.net/");
URL index263=new URL(net263,"index.html")
(3)public URL(String protocol, String host, String file);
new URL("http", "www.gamelan.com", "/pages/Gamelan.net. html");
(4)public URL(String protocol, String host, int port, String file);
URL gamelan=new URL("http", "www.gamelan.com", 80, "Pages/Gamelan.network.html");
注意:类 URL 的构造方法都声明抛弃非运行时例外(MalformedURLException),因此生成 URL 对象时,我们必须要对这一例外进行处理,通常是用 try-catch 语句进行捕获。格式如下:
2. 解析一个 URL
- try {URL myURL = new URL(…)
- } catch(MalformedURLException e) {…
- }
一个 URL 对象生成后,其属性是不能被改变的,但是我们可以通过类 URL 所提供的方法来获取这些属性:
- public String getProtocol() 获取该URL的协议名。public String getHost() 获取该URL的主机名。public int getPort() 获取该URL的端口号,如果没有设置端口,返回-1。public String getFile() 获取该URL的文件名。public String getRef() 获取该URL在文件中的相对位置。public String getQuery() 获取该URL的查询信息。public String getPath() 获取该URL的路径 public String getAuthority() 获取该URL的权限信息public String getUserInfo() 获得使用者的信息public String getRef()获得该URL的锚
当我们得到一个 URL 对象后,就可以通过它读取指定的 WWW 资源。这时我们将使用 URL 的方法 openStream(),其定义为:InputStream openStream(); 方法 openSteam()与指定的 URL 建立连接并返回 InputStream 类的对象以从这一连接中读取数据。按照前面的基础知识介绍,无论使用 TCP 方式还是 UDP 方式进行网络通讯,网络编程都是由客户端和服务器端组成客户端 (Client) 是指网络编程中首先发起连接的程序,客户端一般实现程序界面和基本逻辑实现,在进行实际的客户端编程时,无论客户端复杂还是简单,以及客户端实现的方式,客户端的编程主要由三个步骤实现:(1)建立网络连接客户端网络编程的第一步都是建立网络连接。在建立网络连接时需要指定连接到的服务器的 IP 地址和端口号,建立完成以后,会形成一条虚拟的连接,后续的操作就可以通过该连接实现数据交换了。(2) 交换数据连接建立以后,就可以通过这个连接交换数据了。交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,如果客户端不发送请求则服务器端就不响应。根据逻辑需要,可以多次交换数据,但是还是必须遵循请求响应模型。(3)关闭网络连接在数据交换完成以后,关闭网络连接,释放程序占用的端口、内存等系统资源,结束网络编程。最基本的步骤一般都是这三个步骤,在实际实现时,步骤 2 会出现重复,在进行代码组织时,由于网络编程是比较耗时的操作,所以一般开启专门的现场进行网络通讯。服务器端 (Server) 是指在网络编程中被动等待连接的程序,服务器端一般实现程序的核心逻辑以及数据存储等核心功能。服务器端的编程步骤和客户端不同,是由四个步骤实现,依次是:(1)监听端口服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可。这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的 IP 地址就是服务器端程序的 IP 地址。(2)获得连接当客户端连接到服务器端时,服务器端就可以获得一个连接,这个连接包含客户端的信息,例如客户端 IP 地址等等,服务器端和客户端也通过该连接进行数据交换。一般在服务器端编程中,当获得连接时,需要开启专门的线程处理该连接,每个连接都由独立的线程实现。(3)交换数据服务器端通过获得的连接进行数据交换。服务器端的数据交换步骤是首先接收客户端发送过来的数据,然后进行逻辑处理,再把处理以后的结果数据发送给客户端。简单来说,就是先接收再发送,这个和客户端的数据交换数序不同。其实,服务器端获得的连接和客户端连接是一样的,只是数据交换的步骤不同。当然,服务器端的数据交换也是可以多次进行的。在数据交换完成以后,关闭和客户端的连接。(4)关闭连接当服务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口以及占用的内存可以释放出来,实现了连接的关闭。 注:InetAddress 类没有明显的构造函数。为生成一个 InetAddress 对象,必须运用一个可用的工厂方法。–工厂方法(factory method)仅是一个类中静态方法返回一个该类实例的约定。对于 InetAddress,三个方法 getLocalHost()、getByName()以及 getAllByName()可以用来创建 InetAddress 的实例如果这些方法不能解析主机名,它们引发一个 UnknownHostException 异常。务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口以及占用的内存可以释放出来,实现了连接的关闭。 在该示例代码中,不管发送的数据内容是什么,都需要转换为 byte 数组,然后将服务器端的 IP 地址构造成 InetAddress 类型的对象,在准备完成以后,将这些信息构造成一个 DatagramPacket 类型的对象,在 UDP 编程中,发送的数据内容、服务器端的 IP 和端口号,都包含在 DatagramPacket 对象中。在准备完成以后,调用连接对象 ds 的 send 方法把 DatagramPacket 对象发送出去即可。3)UDP 客户端编程中接收数据首先构造一个数据缓冲数组,该数组用于存储接收的服务器端反馈数据,该数组的长度必须大于或等于服务器端反馈的实际有效数据的长度。然后以该缓冲数组为基础构造一个 DatagramPacket 数据包对象,最后调用连接对象的 receive 方法接收数据即可。接收到的服务器端反馈数据存储在 DatagramPacket 类型的对象内部示例代码: 代码讲解 :首先构造缓冲数组 data,这里设置的长度 1024 是预估的接收到的数据长度,要求该长度必须大于或等于接收到的数据长度,然后以该缓冲数组为基础,构造数据包对象,使用连接对象 ds 的 receive 方法接收反馈数据,由于在 Java 语言中,除 String 以外的其它对象都是按照地址传递,所以在 receive 方法内部可以改变数据包对象 receiveDp 的内容,这里的 receiveDp 的功能和返回值类似。数据接收到以后,只需要从数据包对象中读取出来就可以了,使用 DatagramPacket 对象中的 getData 方法可以获得数据包对象的缓冲区数组,但是缓冲区数组的长度一般大于有效数据的长度,换句话说,也就是缓冲区数组中只有一部分数据是反馈数据,所以需要使用 DatagramPacket 对象中的 getLength 方法获得有效数据的长度,则有效数据就是缓冲数组中的前有效数据长度个内容,这些才是真正的服务器端反馈的数据的内容 4)关闭连接 ds.close();1)首先 UDP 方式服务器端网络编程需要建立一个连接,该连接监听某个端口:DatagramSocket ds = new DatagramSocket(10010); 由于服务器端的端口需要固定,所以一般在建立服务器端连接时,都指定端口号 2)接收客户端发送过来的数据其接收的方法和客户端接收的方法一直,其中 receive 方法的作用类似于 TCP 方式中 accept 方法的作用,该方法也是一个阻塞方法,其作用是接收数据。ds.receive()接收到客户端发送过来的数据以后,服务器端对该数据进行逻辑处理,然后将处理以后的结果再发送给客户端,在这里发送时就比客户端要麻烦一些,因为服务器端需要获得客户端的 IP 和客户端使用的端口号,这个都可以从接收到的数据包中获得。示例代码如下:3)关闭连接 ds.close()就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: