主要内容:
发送端一次性发送的数据,从发送端的缓存区发送给接收方的操作系统中(即缓存区),
接收方直接要数据从自己的操作系统中,不会接收一次(在没有接收完的情况下)就像发送方要一次.从而提高了网络传输的效率.
1. tcp协议及编码
a : 回环地址 : 127.0.0.1 每个计算机都有这个回环地址,只能被本机识别,不能被其他机器识别.
b : 用tcp 实现一个聊天室
服务器端:
import socket sk = socket.socket()# 默认参数 使用基于网络类型的套接字,TCP协议 sk.bind(('127.0.0.1',65534))# 回环地址 sk.listen() while 1: conn,addr = sk.accept()# 接电话 while 1: msg_r = conn.recv(1024).decode('utf-8') print(msg_r) if msg_r == 'q': break # 如果发送q结束客户端的程序,服务器并不结束,需要在接收方加上if语句. msg_s = input('>>>') conn.send(msg_s.encode('utf-8')) if msg_s == 'q': #如果接收到服务器的传来的q结束程序. break conn.close() sk.close()
客户端:
import socket sk = socket.socket() sk.connect(('127.0.0.1',65534)) while 1: msg_s = input('>>>') sk.send(msg_s.encode('utf-8')) if msg_s == 'q': break msg_r = sk.recv(1024).decode('utf-8') if msg_r == 'q': break print(msg_r) sk.close()
tcp协议的三次握手 , 四次挥手:
三次挥手 : @ 一定是客户端先发起请求
1) :客户端发起请求: 请求连接服务器(我想连接你)
2) :服务器返回 : 接收到请求, 并要求连接客户端
3) :客户端 : 可以连接了.
四次挥手: @四次挥手的过程,第一次请求谁先发送都可以
1) :客户端发起断开连接的请求 : (我想和你断开了,我没有数据要发送了,但是,如果你有数据没发完,你就继续发就可以了,我可以继续接收)
2) :服务器回复 : 我接收到你的请求了,我马上着手准备断开
3) :服务器回复 : 我已经准备好断开连接了.
4) :客户端回复 : 收到你的信息,可以断开了.
c : pycharm输出带颜色
1) : 格式设置颜色开始 : 33[前景色;背景色m
不设置背景色 : 33[显示颜色m
2) :格式设置结束 : 33[0m 采用终端默认设置,即取消颜色设置
3) : 前景色:30 背景色: 40 代表黑色 31,红色 32, 绿色 33, 黄色, 34, 蓝色, 35, 紫红色, 36,青蓝色, 37白色.
print(' 33[35m欢迎使用学生选课系统 33[0m') try : num = int(input('请输入数字选择功能:')) except Exception as e: print(' 33[31m输入的内容有误,请重新输入 33[0m')
d : udp协议
服务器端 :
import socket sk = socket.socket(type=socket.SOCK_DGRAM) sk.bind(('127.0.0.1',8787)) msg, addr = sk.recvfrom(1024) print(msg.decode('utf-8'),addr) sk.close()
客户端 :
import socket sk = socket.socket(type=socket.SOCK_DGRAM) sk.sendto('你好a'.encode('utf-8'),('127.0.01',8787)) sk.close()
注意 : 收发信息的过程,一定是客户端先发,要不然会出现错误.即服务器端先发,不知道把信息发给谁.
带署名的udp协议:服务器端:
import socket sk = socket.socket(type=socket.SOCK_DGRAM) sk.bind(('127.0.0.1',8787)) dic = {'alex':' 33[31m','sylar':' 33[34m'} while 1: msg, addr = sk.recvfrom(1024) msg_d = msg.decode('utf-8') name = msg_d.split(':')[0].strip() color = dic.get(name, '') print('%s%s 33[0m' % (color,msg_d)) msg_s = input('>>>:').encode('utf-8') sk.sendto(msg_s, addr) sk.close()
客户端:
import socket sk = socket.socket(type=socket.SOCK_DGRAM) name = input('请输入你的姓名: ') while 1: msg_s = input('请输入聊天的内容:') msg_s = name + ':' + msg_s sk.sendto(msg_s.encode('utf-8'),('127.0.01',8787)) msg, addr = sk.recvfrom(1024) print(msg.decode('utf-8')) sk.close()
e : 解决编码解码问题
先建一个类:
import socket class MySocket(socket.socket):# 继承自 socket文件中的socket类,此时socket就是父类 def __init__(self,encoding='utf-8'): self.encoding = encoding super(MySocket, self).__init__(type=socket.SOCK_DGRAM)# 执行父类socket中的__init__方法 def my_sendto(self,msg,addr): return self.sendto(msg.encode(self.encoding),addr)# 调用父类中的sendto方法 def my_recvfrom(self,num): msg_r,addr = self.recvfrom(num)# 调用父类的recvfrom方法 return msg_r.decode(self.encoding),addr
服务器端:
from My_UDP import MySocket sk = MySocket() sk.bind(('127.0.0.1',8080)) msg,addr = sk.my_recvfrom(1024) print(msg) sk.close()
客户端:
from My_UDP import MySocket sk = MySocket() sk.my_sendto('abcabc中国',('127.0.0.1',8080)) sk.close()