python 网络开发和通信

=========day06.网络开发和通信=========

1.回顾数据库。



2.OSI(Open System Interconnect 网络互联模型):
	
	七层(五层)模型:
		
		应用层=====为应用程序提供服务

		表示层=====数据格式化,数据加密: 文字,图像,声音等不同表现形式的信息

		会话层=====建立,管理和维护会话
			                  (应用层)================HTTP Telnet FTP TFTP DNS SMTP


		传输层=====建立,管理和维护端到端的连接,负责可靠传输==========TCP UDP

		网络层=====IP选址及路由选择(路由器)===========IP ICMP RIP IGMP

		数据链路层===提供介质访问和链路管理(交换机)===ARP RARP IEEE802.3 PPP CSMA/CD

		物理层=====比特流和电子信号之间的切换===========FE自协商 Manchester MLT-3 4A PAM5



3.UDP通信:
	通信过程:类似于发短息,不需要先建立连接



4.TCP通信:(三次握手,四次挥手)
	通信过程:类似于打电话,需要先建立连接

	三次握手:
		1.首先Client端发送连接请求报文,
		2.Server段接受连接后回复ACK报文,并为这次连接分配资源。
		3.Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,
		  这样TCP连接就建立了.

	四次挥手:(全双工:发送信息的同时,也能收信息)
		1.客户端说,我要断开了;
		2.服务器回复,断开吧;
		3.服务器说,我也要断开了;
		4.客户端回复,断开吧。



5.TCP与UDP区别总结:
	1、TCP面向连接(如打电话要先拨号建立连接);
	   UDP是无连接的,即发送信息之前不需要建立连接。

	2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;
	   UDP尽最大努力交付,即不保证可靠交付。
	   Tcp 通过校验和重传控制,序号标识,滑动窗口、确认应答实现可靠传输。
	   如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。

	3、UDP具有较好的实时性,工作效率比TCP高,
		适用于对高速传输和实时性有较高的通信或广播通信。

	4、每一条TCP连接只能是一对一的;
		UDP支持一对一,一对多,多对一和多对多的交互通信。

	5、TCP对系统资源要求较多,UDP对系统资源要求较少。




6.python内置socket模块:
	服务器===server
	客户端===client



7.tcp服务器:
	from socket import socket

	# 1.创建socket, 参数不填默认ipv4,tcp传输
	server_sk = socket()

	# 2.绑定,服务器ip和端口
	server_sk.bind(('0.0.0.0', 9898))
	-- 说明:'0.0.0.0'表示本机所有ipv4地址
	
	# 3.变为监听套接字
	# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
	# 监听,最多允许128个接入
	server_sk.listen(128)

	print('服务器在等待,客户端的到来 .... ')

	while True:
		# 如果有客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务 
		# client_sk用来为这个客户端服务 
		# server_sk就可以省下来专门等待其他新客户端的链接 
		
		# 4.阻塞直到接收到客户端连接 
		client_sk,addr = server_sk.accept() 
		
		# 5.接受客户端信息
		data = client_sk.recv(1024)  
		print('接收到的数据为:', data.decode('utf-8'))

		# 6.向客户端发送 'OK'
		client_sk.send('OK'.encode('utf-8'))  
		client_sk.close  # 关闭为这个客户端服务的套接字




8.tcp客户端构建流程:
	
	from socket import socket

	# 1.创建socket, 参数不填默认ipv4,tcp传输
	client_sk = socket()
	
	# 2.链接服务器,(server_ip, server_port)
	client_sk.connect(('127.0.0.1', 9898))
	
	# 3.向服务器发送消息'你好'
	client_sk.send('你好'.encode("utf-8"))

	# 4.接收对方发送过来的数据,最大接收1024个字节
	recvData = client_sk.recv(1024)
	print('服务器发来的数据为:', recvData.decode('utf-8'))

	# 关闭客户端套接字
	client_sk.close()	





9.客户端例2import socket
	# 创建一个socket:
	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	# 建立连接:	
	s.connect(('172.16.10.119', 80))

	# 发送数据:
	s.send(b'GET / HTTP/1.1\r\n172.16.10.119:8080/bwie/mhIndex.do\r\nConnection: close\r\n\r\n')


	# 接收数据:
	buffer = []
	while True:
	    # 每次最多接收1k字节:
	    d = s.recv(1024)
	    if d:
	        buffer.append(d)
	    else:
	        break
	data = b''.join(buffer)

	# 关闭连接:
	s.close()

	header, html = data.split(b'\r\n\r\n', 1)
	print(header.decode('utf-8'))
	# 把接收的数据写入文件:
	with open('sina.html', 'wb') as f:
	    f.write(html)




10.服务器例2import socket
	# 创建一个socket:
	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

	# 监听端口:
	s.bind(('127.0.0.1', 9999))

	s.listen(5)
	print('Waiting for connection...')


	def tcplink(sock, addr):
	    print('Accept new connection from %s:%s...' % addr)
	    sock.send(b'Welcome!')
	    while True:
	        data = sock.recv(1024)
	        time.sleep(1)
	        if not data or data.decode('utf-8') == 'exit':
	            break
	        sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
	    sock.close()
	    print('Connection from %s:%s closed.' % addr)


	while True:
	    # 接受一个新连接:
	    sock, addr = s.accept()
	    # 创建新线程来处理TCP连接:
	    t = threading.Thread(target=tcplink, args=(sock, addr))
	    t.start()

猜你喜欢

转载自blog.csdn.net/lq_hello/article/details/106096650