网络通信,基于套接字socket进行通信

发布时间 2023-03-28 18:50:52作者: 无敌大帅逼

1.应用层:

应用层功能:规定应用程序的数据格式。

例:TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”。


2.传输层:

传输层功能:建立端口到端口的通信

补充:端口范围0-65535,0-1023为系统占用端口

tcp协议:

可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割


3.osi七层协议

 


4.TCP三次握手四次挥手:

5 基于套接字通信:

5.1:tcp协议服务端:

'''
服务端应该满足的特点:
1.一直提供服务
2.并发的提供服务
'''


import socket
#1.买手机
# phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #流式协议--> tcp协议
phone = socket.socket() #默认是TCP协议


# 2.绑定手机卡
# 0.0.0.0 ----> 代表允许任何的ip链接
phone.bind(('127.0.0.1',8080))   #ip+端口(0-65535)1024以前的都被系统保留使用


#3.开机  (监听状态)
phone.listen(5)   #5指的是半连接池大小

#4.等待电话连接请求:拿到电话连接conn
#加上链接循环
while True:
   conn,client_addr = phone.accept() #接受,程序启动后,会在accept这里夯住,阻塞
   print(conn)  #连接对象,三次握手的双向通路
   print('客户端的ip和端口:',client_addr)

   while True:
      try:
         #5.通信:收/发消息
         data = conn.recv(1024)  #最大接受的数据量为1024Bytes,收到的是bytes类型
         if len(data) == 0:
            # 针对unix系统里,一旦data收到为空
            # 意味着是一种异常的行为:客户非法断开链接
            break
         print('客户端发来的消息:',data.decode('utf8'))
         conn.send(data.upper())
      except Exception:
         #针对windows系统
         break

   #6.关闭电话连接comm
   conn.close()

#7.关机(可选操作)
# phone.close()

tcp协议客户端:

import socket


#1.买手机       sokcet类      地址家族
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #流式协议--> tcp协议


#2.拨通服务端电话
phone.connect(('127.0.0.1',8080))  #进行3次握手

while True:
   msg = input('输入要发送的消息:').strip()
   if len(msg) == 0:continue  #解决输入空格的bug
   if msg == 'quit':
      break
   # 3.通信
   phone.send(msg.encode('utf8')) #编码以二进制的形式发送

   data = phone.recv(1024)
   print(data.decode('utf8'))    #解码


#4.关机连接(必选的回收资源的操作)
phone.close()

5.2udp协议服务端(用在对实时性要求很高的程序上面)

import socket
sever = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #udp协议


sever.bind(('127.0.0.1',8081))

while True:
   data,client_addr = sever.recvfrom(1024)
   sever.sendto(data.upper(),client_addr)

sever.close()

udp协议客户端

import socket

client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #udp协议
while True:
   msg = input('输入要发送的消息:').strip()
   client.sendto((msg.encode('utf8')),('127.0.0.1',8081))
   res = client.recvfrom(1024)
   print(res)

client.close()