Java高级特效---网络编程

1、TCP/IP协议的理解

TCP/IP(Transmission Control Protocol/Internet Protocol的简写),中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议。这个协议是Internet最基本的协议,也是Internet的基础。它的名字是由网络层的IP协议和传输层的TCP协议组成的。确切地说,TCP/IP协议是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议和其他一些协议的协议组。
TCP/IP定义了电子设备如何连如因特网,以及数据如何在它们之间传输的标准。它是互联网中的基本通信语言或协议,在私网中,它也被用作通信协议。当用户直接网络连接时,计算机应提供一个TCP/IP程序的标准实现,而且接收发送的信息的计算机也应有一个TCP/IP程序的标准实现。
TCP/IP并不完全符合OSI标准制定的七层参考模型,它采用了四层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这四层分别为:
在这里插入图片描述

  1. 应用层:应用程序间的沟通的层,如万维网(WWW)、简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
  2. 传输层:在此层中,它提供了节点间的数据 传输,应用程序之间的通信服务,主要功能是数据格式化、数据确认和丢失重传等。主要协议包括TCP和UDP。
  3. 互联网络层:负责提供基本的数据封装包传输功能,让每一块数据包都能够到达目的的主机,但不检查是否被正确接收主要体现为IP协议。
  4. 网络接口层:接收IP数据报并进行传输,从网络上接收物理帧,抽取IP数据报转交给下一层,对实际的网络媒体的管理,定义如何使用物理网络,如以太网。

2、TCP协议的通信特点是什么

TCP是一种面向连接的、可靠的、基于字节流的运输层(Transport Layer)通信协议。在TCP/IP协议组中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接。但IP层不提供这样的流机制,而是提供不可靠的包交换,此时TCP协议就可以提供这样的一种可靠的链接。
应用层向TCP层发送8为字节表示的数据流,然后TCP把数据流分割成适当长度的报文段,之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,采用一种精确的确认机制,一旦发送失败将提供重发的机会,可以保证数据的可靠运输。

总结
TCP协议主要特点:

  1. 面向连接的传输;
  2. 端到端的通信;
  3. 可靠性,确保传输数据的正确性,不出现丢失或者乱序;
  4. 采用字节流方式,即以字节为单位传输字节序列。

3、Java的TCP编程模型是什么

编写Java的TCP网路应用程序需要分为服务器端和客户端两个部分,步骤如下。
服务器端:

  1. 创建一个服务器端的Socket,指定一个端口号;ServerSocket ss = new ServerSocket(int型的端口号);//创建ServerSocket
  2. 开始监听来自客户端的请求要求,调用ServerSocket的accept()方法;ss.accept();
  3. 获得输出流和输入流;
Socket socket = ss.accept();//accept获取socket对象
OutputStream os = socket.getOutputStream();//获得输出流
InoutStream is = socket.getInputStream();//获得输入流
  1. 调用输入流/输出流的read()和write()方法,进行数据的传输。如果是字符数据流,一般还可以用BufferdReader或PrintWriter进行数据的传输;
OutputStream os = s.getOutputStream();//获得输出流
PrintWriter pw = new PrintWriter(os);//创建PrintWriter对象
pw.print(内容);
pw.flush();//清空缓存

//或者
InputStream is = s.getInputStream();//获得输入流
InoutStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
  1. 释放资源,关闭输出流/输入流、Socket和Server Socket对象。
pw.close();//关闭输出流
s.close();//关闭socket
ss.close();//关闭server socket

客户端:

  1. 创建Socket对象,建立与服务器端的链接;
Socket s = new Socket("IP地址",端口号);//用IP地址和端口创建Socket对象
  1. 获得输出流或输入流;
  2. 调用输入流/输出流的read()方法或write()方法,进行数据的传输;
  3. 释放资源,关闭输出流/输入流、Socket对象。

4、UDP协议的通信特点是什么

UDP协议是一个简单的面向数据报的传输层协议,与TCP/IP协议同处于传输层,介于应用层和IP协议之间。同样,UDP网络应用程序使用UDP协议进行通信的时候,需要提供端口号,以区分各个程序之间的通信通道。
与TCP不同,UDP不提供对IP协议的可靠机制、流控制以及错误恢复功能能。由于UDP比较简单,头部包含了很少的字节,比TCP负载消耗少,速度也相对快一些。
UDP适用于不需要TCP可靠机制的情形,它也服务于很多知名应用层协议,包括域名系统(DNS)、简单文件传输系统(TFTP)、动态主机配置协议(DHCP)、某些视频会议程序和某些影音串流服务等。

总结

  1. UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能地把它扔到网络上;
  2. 不需要维护连接状态,包括收发状态等;
  3. 字节开销很小;
  4. 吞吐量主要受应用软件生成数据的速率、传输带看、源端和终端主机性能等因素的限制。

5、Java的UDP编程模型

UDP一般用于安全性要求不高的点对点传输模式的应用程序,都会存在两个终端。两端的编程方式类似,基本步骤:

  1. 创建数据Socket,指定一个端口号。Java提供了java.net.DatagramSocket类来支持这一步,两端可以使用不同的端口号;
DatagramSocket ds = new DatagramSocket(9999);
  1. 对于接收消息的一端来说,提供一个byte数组进行数据的存储;而对于发送消息的一端,除此以外来需要提供对端的IP地址和端口号,
byte[] buff = new byte[1024];
DatagramPacket dp = new DatagramPacket(buff,1024);//长度小于等于buff的长度
//或者
String str = "数据";
//用byte数组,创建数据包对象
DatagramPacket dp = new DatagramPacket(str.getBytes(),0,str.length(),InetAddress.getByName("localhost"),9999);
  1. 调用DatagramPacket的receive()或send()方法进行数据的接收或发送:
ds.receive(DatagramPacket对象);//接收消息
ds.send(DatagramPacket对象);//发送消息
  1. 调用DatagramPacket的getData()方法得到byte数组的数据。
dp.getData;
  1. 释放资源。关闭DatagramSocket对象
ds.close();

6、如何使用Java访问Web站点

统一资源定位符URL(Uniform Resources Locatior)也称为网页地址,是因特网上标准的资源地址,它唯一的标识了一个网络上的资源。Java通过了java.net.URL类来支出它,也就是通过它来访问网络资源。
java.net.HttpURLConnection是代表HTTP网络连接的类,它由URL类的openConnection()方法获得。HttpURLConnection可以模拟一个浏览器,在发出请求的时候,设置各种请求头参数,设置请求残花,传输请求数据;在收到相应结果的时候,也可以获得响应头数据和响应内容,它也是对TCP传输的输入流/输出流的一种包装。以下为一个使用HttpURLConnection访问某网站的例子:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import java.util.List;

public class SearchWeb {
	public static void main(String[] args) throws Exception {
		//创建URL对象
		URL url = new URL("https://www.csdn.net/");
		//同URL创建HttpURLConnection对象
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		//打开链接
		conn.connect();
		//打印请求响应的头部信息
		Map<String,List<String>> header = conn.getHeaderFields();
		for (String str : header.keySet()) {
			System.out.println(str+":"+header.get(str));
		}
		//打印响应内容
		BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
		String s = null;
		while((s=br.readLine())!=null) {
			System.out.println(s);
		}
		conn.disconnect();//断开链接
	}
}

以上代码中,使用HttpURLConnection的getHeaderFields()方法得到网站的响应头信息,采用的是Map键值对格式。如果需要得到响应的内容时,则可以调用getInputStream()方法得到输入流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值