黑马程序员——网络协议之tcp协议和udp协议

------ Java培训、Android培训、java学习型博客、期待与您交流! -------


一、网络协议概述。

        网络协议:为了计算机之间进行数据交互提供的一种规则和标准。在计算机网络中,每个计算机在的地理位置都不一样,为了让不同的计算机能够相互通信,故为他们定义了一种规则, 只有当其中的每台计算机都遵从这个规则,这些计算机之间才能进行通讯。举个例子,人和人之间面对面交流,他们之间都要遵守一个规则——声音在空气中传播。如果其中一个人没遵守这个规则,他说话的声音不是在空气中传播的,那么他就不能和其他的人进行交流。

 

二、网络协议要素。

        (1)语义。语义是解释控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应。

        (2)语法。是用户数据与控制信息的结构与格式,以及数据出现的顺序。

        (3)时序。时序是对事件发生顺序的详细说明。(也可称为“同步”)。

        这三个要素可以简单的理解为:语义表示要做什么,语法表示怎么做,时序表示按照什么顺序做。

 

三、网络协议的层次划分。 

        为了使不同计算机厂家生产的计算机能够相互通信,以便在更大的范围内建立计算机网络,国际标准化组织(ISO)在1978年提出了“开放系统互联参考模型”,即著名的OSI/RM模型(Open System Interconnection/Reference Model)。它将计算机网络体系结构的通信协议划分为七层,自下而上依次为:物理层(Physics Layer)、数据链层(Data Link Layer)、网络层(Network Layer)、传输层(Transport Layer)、会话层(Session Layer)、表示层(Presentation Layer)、应用层(Application Layer)。

 

四、常见的网络协议。

        TCP/IP协议毫无疑问是这三大协议中最重要的一个,作为互联网的基础协议,没有它就根本不可能上网,任何和互联网有关的操作都离不开TCP/IP协议。不过TCP/IP协议也是这三大协议中配置起来最麻烦的一个,单机上网还好,而通过局域网访问互联网的话,就要详细设置IP地址,网关,子网掩码,DNS服务器等参数。TCP/IP尽管是目前最流行的网络协议,但TCP/IP协议在局域网中的通信效率并不高,使用它在浏览“网上邻居”中的计算机时,经常会出现不能正常浏览的现象。此时安装NetBEUI协议就会解决这个问题。

        NetBEUI即NetBios Enhanced User Interface ,或NetBios增强用户接口。它是NetBIOS协议的增强版本,曾被许多操作系统采用,例如Windows for Workgroup、Win 9x系列、Windows NT等。NETBEUI协议在许多情形下很有用,是WINDOWS98之前的操作系统的缺省协议。NetBEUI协议是一种短小精悍、通信效率高的广播型协议,安装后不需要进行设置,特别适合于在“网络邻居”传送数据。所以建议除了TCP/IP协议之外,小型局域网的计算机也可以安上NetBEUI协议。另外还有一点要注意,如果一台只装了TCP/IP协议的WINDOWS98机器要想加入到WINNT域,也必须安装NetBEUI协议。
        IPX/SPX协议本来就是Novell开发的专用于NetWare网络中的协议,但是也非常常用--大部分可以联机的游戏都支持IPX/SPX协议,比如星际争霸,反恐精英等等。虽然这些游戏通过TCP/IP协议也能联机,但显然还是通过IPX/SPX协议更省事,因为根本不需要任何设置。除此之外,IPX/SPX协议在非局域网络中的用途似乎并不是很大.如果确定不在局域网中联机玩游戏,那么这个协议可有可无。
 
五、tcp协议和udp协议的比较。
        tcp协议是面向连接的一种协议,即两台计算机之间要首先建立了连接才能进行通讯。tcp协议的特点是:面向连接、数据完整性、传输速度慢。
        udp协议是面向连接的协议,即计算机之间通讯不用建立连接,数据是以“丢”的方式传输出去的,基于对方能不能收到这个数据还是一个未知数。udp的特点是:面向无连接,不安全(数据可能丢失),传输速度快。

        udp协议举例:

        udp接受端代码:

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpDemoRec {
		public static void main(String[] args){
			try {
				//建立socket服务并关联端口8888
				DatagramSocket ds = new DatagramSocket(8888);
				//封装用于接受数据的数据包
				byte[] buff = new byte[1024];
				DatagramPacket dp = new DatagramPacket(buff,buff.length);
				//将接收的数据放到dp中
				ds.receive(dp);
				
				String address = dp.getAddress().toString();
				int port = dp.getPort();
				byte[] data = dp.getData();
				String result = new String(data,0,dp.getLength());
				System.out.println(address+":" + result + ":" + port);
				
				ds.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
}


        udp发送端代码:

import java.net.*;

public class UdpDemoSend {

	public static void main(String[] args){
		try {
			//建立Socket服务
			DatagramSocket ds = new DatagramSocket();
			//封装数据包
			byte[] buff = "udp 协议传输".getBytes();
			DatagramPacket dp = 
					new DatagramPacket(buff, buff.length, InetAddress.getByName("localhost"), 8888);
			//发送数据包
			ds.send(dp);
			ds.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

        当先运行发送端时,这时接收端还没开启,代表是无连接的。发送端发送出去的数据会丢失,代表不安全。效果图:

黑马程序员——网络协议之tcp协议和udp协议_第1张图片

        当先运行接收端时,再运行发送端,数据就能发送到目的地。运行效果:

黑马程序员——网络协议之tcp协议和udp协议_第2张图片

        tcp协议举例:

        tcp服务器端代码:

import java.net.*;
import java.io.*;
public class TcpServer {

	public static void main(String[] args){
		try {
			ServerSocket ss = new ServerSocket(10000);
			
			Socket s = ss.accept();
			String address = s.getInetAddress().toString();
			System.out.println(address + "......connected");
			InputStream is = s.getInputStream();
			byte[] buf = new byte[1024];
			int len = is.read(buf);
			String serverSay = new String(buf,0,len);
			System.out.println(serverSay);
			
			OutputStream os = s.getOutputStream();
			os.write("tcp服务端——>欢迎连接".getBytes());
			ss.close();
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}

        tcp客户端代码:


import java.io.*;
import java.net.*;

public class TcpClient {

	public static void main(String[] args){
	 try {
		 //创建Socket服务, 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
		Socket s = new Socket(InetAddress.getByName("localhost"),10000);
		//获取客户端的输出流OutputStream,并向服务端发松数据。
		OutputStream os = s.getOutputStream();
		os.write("tcp客户端——>服务器,你好!".getBytes());
		
		InputStream is = s.getInputStream();
		byte[] buf = new byte[1024];
		int len = is.read(buf);
		String serverSay = new String(buf,0,len);
		System.out.println(serverSay);
		s.close();
	} catch (IOException e) {
		e.printStackTrace();
	}
	}
}


当先运行客户端时,回报错,提示连接错误,这代表tcp是面向连接的,传输数据之前必须要建立连接:

黑马程序员——网络协议之tcp协议和udp协议_第3张图片

当先运行服务器端时,就可以进行数据通讯了:

黑马程序员——网络协议之tcp协议和udp协议_第4张图片

你可能感兴趣的:(黑马程序员——网络协议之tcp协议和udp协议)