第二十四次

网络编程三要素

1.协议 2.IP地址 3.端口号

协议分类

通信的协议还是比较复杂的,java.net包中包含的类和接口,它们提供低层次的通信细节,我们可以直接使用这些类和接口,来专注于网络程序开发,而不用考虑通信的细节。java.net包中提供了两种常见的网络协议的支持:TCP和UDP
TCP是可靠的连接,TCP就像打电话,需要先打通对方电话,等待对方有回应后才会跟对方继续说话,也就是一定要确认可以发信息以后才会把信息发出去。TCP上传任何东西都是可靠的,只要两台机器上建立起了连接,在本机上发送的数据就一定能传到对方的机器上。
UDP就好比发电报,发出去就完事了,对方有没有接收到它都不管,所以UDP是不可靠的。
TCP传送数据虽然可靠,但传送得比较慢;
UDP传送数据不可靠,但是传送得快。

UDP

用户数据报协议(User Datagram Protocol)。UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时,不建议使用UDP协议。
特点:数据被限制在64kb以内,超出这个范围就不能发送了。
数据报(Datagram):网络传输的基本单位

TCP

传输控制协议(Transmission Control Protocol)。TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。
(1)三次握手
TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。
第一次握手,客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。(客户端向服务器端发出连接请求,等待服务器确认。)
第二次握手,服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。(服务器端向客户端回送一个响应,通知客户端收到了连接请求。)
第三次握手,客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。(客户端再次向服务器端发送确认信息,确认连接。)三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了,整个交互过程如下图所示。
在这里插入图片描述

IP协议

(一)概念
IP协议:网络互连协议
在这里插入图片描述
每个人的电脑都有一个独一无二的IP地址,这样互相通信时就不会传错信息了。
(二)分类
IP地址根据版本可以分类为:IPv4和IPv6
在这里插入图片描述
IPv4又可以分为五类:
在这里插入图片描述
A类:在IP地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码;A类IP地址中网络的标识长度为8位,主机标识的长度为24位,A类网络地址数量较少,有126个网络,每个网络可以容纳主机数达1600多万(256的三次方-2)台。
B类:在IP地址的四段号码中,前两段号码为网络号码。B类IP地址中网络的标识长度为16位,主机标识的长度为16位,B类网络地址适用于中等规模的网络,有16384个网络,每个网络所能容纳的计算机数为6万多(256的二次方-2)台
C类:在IP地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码;此类地址中网络的标识长度为24位,主机标识的长度为8位,C类网络地址数量较多,有209万余个网络。适用于小规模的局域网络,每个网络最多只能包含254(256-2)台计算机
D类:此类IP地址在历史上被叫做多播地址(multicast address),即组播地址;在以太网中,多播地址命名了一组应该在这个网络中应用接收到一个分组的站点;多播地址的最高位必须是“1110”,范围从224.0.0.0到239.255.255.255E类: 此类地址也不分网络地址和主机地址,它的第1个字节的前五位固定为“11110”,为将来使用保留,地址范围从240.0.0.1到255.255.255.254

代码及成果展示

demo01

package demo01Tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClient {
	public static void main(String[] args) throws IOException {
		//1.创建一个客户端对象socket,构造方法中绑定服务器的IP地址和端口号
		Socket socket=new Socket("127.0.0.1",6666);
		//2.使用outputstream获取输出流对象
		OutputStream os = socket.getOutputStream();
		//3.使用write方法写数据
		os.write("你好,服务器".getBytes());
		//4.使用getinputstream获取输入流
		InputStream is=socket.getInputStream();
		//5.使用输入流的read方法获取从服务器发来的数据
		byte[] bytes = new byte[1024];
	    int len=is.read(bytes);
	    System.out.println(new String(bytes,0,len));
	    //6.释放资源
	    socket.close();
	}
}
package demo01Tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
	public static void main(String[] args) throws IOException{
		//1.创建服务器ServerSocket对象和系统指定的端口号
		ServerSocket server=new ServerSocket(6666);
		//2.使用ServerSocket对象中的accept方法,获取到请求的客户端对象socket
		Socket socket=server.accept();
		//3.使用socket 对象中的getInputStream获取网络中输入流的对象
		InputStream is=socket.getInputStream();
		//4.使用网络客户端流中的read方法,读取客户端发送的数据
		byte[] bytes = new byte[1024];
	    int len=is.read(bytes);
	    System.out.println(new String(bytes,0,len));
	    //5.使用socket对象中的outputstream方法,获取输出流
	    OutputStream os = socket.getOutputStream();
	    //6.使用输出流中的write给客户端会写数据
	    os.write("收到数据,谢谢".getBytes());
	    //7.释放资源
	    socket.close();
	    socket.close();
	}
}

在这里插入图片描述
在这里插入图片描述

2020080605045 袁雪华 大数据2005

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值