网络通信——>TCP协议和UDP协议的客户端与服务端之间的建立

网络编程
OSI有七层模型:它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。如下图:
OSI模型    TCP/IP模型

网络编程的三要素:
1、IP地址

##  获取ip地址和主机名的方式
#需要导入socket模块
import  socket
name = socket.gethostname()
ip = socket.gethostbyname()
print(name,ip)

2、端口号:
0–65526是有效端口,0–1024是系统使用或者保留端口

3、协议:通信的方式,例如:TCP DUP
TCP的优缺点:需要建立连接、速度慢、但是可靠安全。
UDP的优缺点:不需要建立连接、速度快、不可靠不安全、只管发不管对方是否收到。

下面是TCP协议和UDP协议的客户端和服务端建立连接
TCP通信代码

#创建TCP协议的客户端
import socket
#1、创建socket对象,第一个参数ipv4协议,第二个面向流的TCP协议
s = socket.socket(socket.AF_INET,sock.SOCK_STREAM)
# 2、建立连接:ip地址和端口号(连接那台计算机就写它的ip和端口号,本机的ip:“127.0.0.1”)
s.connect(('127.0.0.1',8001))
# 3、发送数据
while True:
		data = input("客户端发出请求:")
		#向客户端发送数据
		s.send(data.encode())

		#  接收客户端的数据
		data1 = s.recv(1024)
		print(data1.decode('utf-8'))
		#  输入byebye结束死循环
		if  data1 == b'byebye':
				break
s.close()		
###  创建TCP的服务端
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定客户端的IP地址和端口
s.bind(('127.0.0.1',8848))

#监听:接收多少个客户端
s.listen(2)

#接收客户端的请求
cilent,addres = s.accept()
while True:
    #接收客户端发来的数据
# 使用cilent客户端而不是使用s服务端是因为服务端面对很多客户端,
# 所以不能使用服务端,否则不知道回复给那个客户端
    data1 = cilent.recv(1024)
    print(data1.decode('utf-8'))

    #服务器响应客户端
    data2= input('服务器响应:')
    cilent.send(data2.encode('utf-8'))
    if data1 == b'byebye':
        break
s.close()

以上是TCP协议的客户端和服务端建立连接,可以向qq一样互发消息

#UDP客户端
import socket
#  这点需要注意的是第二个参数与TCP的是不一样的
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
    data = input('>>>:')
    s.sendto(data.encode(),('10.8.156.43',8000))

    data1,addr1= s.recvfrom(1024)
    print(data1.decode(),addr1)
    if data1 == b'byebye':
        break
s.close()
#UDP协议服务端
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('10.8.156.43',8000))
while True:
    data,addr = s.recvfrom(1024)
    print(data.decode(),addr)

    data1 = input('>>>:')
    s.sendto(data1.encode(),addr)
    if data == b'byebye':
        break
s.close()

UDP建立连接与TCP建立连接相比不需要客户端发出连接请求,服务端也不需要监听。

猜你喜欢

转载自blog.csdn.net/Mr_791063894/article/details/83035743