成长学习记录--------初步学习TCP,UDP协议

TCP/IP协议

TCP/IP协议是一个协议集合,里面包含有多种网络通信的协议,其中最基本协议的就是TCP协议和IP协议。

IP协议(网协协议)

IP是用于计算机之间的通信,因为有了独特的IP,不同的计算机找到其他主机并实现数据的传递,目前有IPv4和IPv6,目前广泛应用IPv4。

IPv4由4组范围是[0~255]的数字组成一个32位地址,例如255.255.255.255,默认的本机IP为127.0.0.1 。

IPv4被分为五类:A、B、C、D、E五类

可以简单的理解每次都把相应区间折半来划分类别

比如A类的第一组地址范围为0~127,也就是把0~255折半分成了0~127和128~255

以此类推

B类为128~191,即将128~255进行折半,划分成128~191和192~255

C类为192~223,即将192~255进行折半,划分成192~223和224~255

D类为224~239,即将224~255进行折半,划分为224~239和240~255

E类为剩下的240~255

Windows通过ipconfig,linux通过ifconfig命令查看本机IP。

数据包

联网的基本传送单元是IP数据包,数据包是分组交换的一种形式,把所传送的数据分段打包,再传送出去,属于“无连接型”,每个包都作为独立的报文传送出去,所以就不需要事先连接好一条电路供数据包传输,因为数据包传输是无序的,各个数据包都不一定通过同一条路径传输。

每个数据包都有报头和报文,报头中含有目的地址等信息,数据包通过报头能够准确的到达目的地,当数据包到达了目的地后在根据分组的信息进行重新组合还原成原来发送的完整数据。

数据 ----> 分组打包 ----> 数据包 ----> 无序发送 ----> 到达目的地重组 -----> 数据

TCP协议

TCP用于应用程序之间的通讯。

应用程序希望和另一个应用程序通信,就需要TCP协议建立通讯,应用就会发送一个通讯请求,通过IP和端口号准确找到另一个应用程序,两个应用程序“握手”后,建立一个全双工的通信。

TCP的三次握手,四次挥手。

所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立,完成三次握手,客户端与服务器开始传送数据。就像是双方打电话,需要互相验证。

所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。

TCP传输数据Java实现

本次学习的是java里面的InetAddress类,InetAddress的一个实例由一个IP地址和可能的相应主机名组成。InetAdddress不能通过new操作符生成,可以通过InetAdddress.geBytName()静态方法获取得到InetAdddress对象的原始IP地址,如 利用localhost获取IP地址。

InetAddress ipAddress = InetAddress.getByName("127.0.0.1");
System.out.println(ipAddress);
localhost/127.0.0.1

Socket类位于java.net下面,用于实现网络连接。

有了IP和端口号就可以创建套接字(Socket对象),并将其连接到指定远程地址上的指定远程端口。

比如生成一个连接到127.0.0.1(localhost)上的8000端口的Socket对象

Socket socket = new Socket(ipAddress, 8000);

有了Socket对象就可以通过输入\输出流进行数据传递了,通过Socket对象的getOutputStream()方法得到套接字的输出流,对输出流进行编辑自己想输出的数据信息即可,比如写一个“hello world”到输出流中。

OutputStream outputStream = socket.getOutputStream();

outputStream.write("hello world".getBytes());

然后不想输出东西了就把输出流(outputStream)和Socket对象关闭。

outputStream.close();
socket.close();

对于接受端想要接收发送来的数据,得先生成一个指定端口号的ServerSocket对象,取指定的端口号收取数据,因为数据是发送到你这个特定IP和指定端口号的,你就去本身的那个指定端口号收取数据,使用accept()方法侦听要连接到此套接字并接受它,返回值是一个Socket对象。

ServerSocket serverSocket = new ServerSocket(8000);

Socket socket = serverSocket.accept();

然后通过获得的Socket对象的getInputStream()方法得到输入流,读取出输入流中的数据,存放到能够输出的输出流验证传送信息是否正确。

InputStream inputStream = socket.getInputStream();

ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;

while((len = inputStream.read(buffer))!= -1) {
baos.write(buffer, 0, len);
}
System.out.println(baos.toString());

接收后就关闭输入流(InputStream)、socket、serverSocket,释放资源。

inputStream.close();
socket.close();
serverSocket.close();

启动时必须先启动服务端,确保端口开启,再启动发送端进行数据发送。

得到hello world证明成功发送和成功接收。

hello world

UDP协议

UDP协议作为传输层最重要的协议之一,和TCP协议却完全不同,TCP协议复杂,传输可靠,有三次握手的机制。UDP协议则是简单,传输不可靠,也就是说UDP协议能够传输数据,但不能保证接收端百分之百接收到数据,UDP协议同样使用数据包(datagram)的方式传输,把数据包发送到指定IP和指定端口上,UDP的数据包同样分为头部(header)和数据(payload)两部分,随后UDP包在目的电脑拆封,并将信息送到相应端口的缓存中。虽然UDP是不可靠传输,但是UDP不需要建立连接,所以速度快,可以实现无连接的通信。

UDP协议传输JAVA实现

先生成一个DatagramSocket对象用于发送数据包。

DatagramSocket socket = new DatagramSocket();

再建立数据包,把要发送的数据,发送到哪里去封装到DatagramPacket中。

String msg = "hello world";//需要传输的数据信息
InetAddress ipAddress = InetAddress.getByName("127.0.0.1"); //IP地址
int port = 8000; //端口号
		
DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0,msg.getBytes().length, ipAddress, port);

然后用Datagramsocket对象的send()方法发送数据包。

socket.send(packet);

发送结束,关闭Datagramsocket对象,释放资源。

socket.close();

服务端生成一个指定端口的DatagramSocket对象,确保端口的开放,以及生成一个DatagramPacket对象来接收发送过来的数据包。

DatagramSocket socket = new DatagramSocket(8000);
		
byte[] buffer = new byte[1024];
		
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);

使用DatagramSocket对象的send()方法接收发送过来的数据包,并展现出数据包的信息。

socket.receive(packet);
System.out.println(new String(packet.getData(),0,packet.getLength()));

然后关闭DatagramSocket对象,释放资源。

socket.close();

先启动接收端,在启动发送端,成功接收到传送的数据信息,完成发送。

hello world

 

 

猜你喜欢

转载自www.cnblogs.com/wuxiaojie/p/12442966.html
今日推荐