# 网络编程
# arp协议:通过ip找mac地址
# ip:一台计算机在网络上的位置
# 端口号:网络相关的程序才需要开一个端口,为的是能找到某台计算机上唯一的一个程序
# 在同一台计算机上,同一时间,只有一个程序占用同一个端口
# 一般情况下,8000以后
# tcp协议 udp协议
# tcp:可靠的,面向连接的,耗时长
# 三次握手
# 四次挥手
# udp:不可靠,无连接,效率高
# IP协议属于网络osi七层协议中的 网络层
# TCP协议和udp协议属于 传输层
# arp协议属于 数据链路层
###########################################################################################
socket:
tcp协议:当有两个客户端和服务器通信时,服务器只能和一个保持连接,和其中一个断开以后再与另一个连接
server代码


import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen(0) while True: conn,addr = sk.accept() while True: ret = conn.recv(1024).decode('utf-8') print(ret) if ret == 'bye': break info = input('>>>') if info == 'bye': conn.send(b'bye') break conn.send(info.encode('utf-8')) conn.close() sk.close()
client1代码:


import socket sk = socket.socket() sk.connect(('127.0.0.1',8080)) while True: info = input('>>>') if info == 'bye': sk.send(b'bye') break sk.send(('client2:'+info).encode('utf-8')) ret = sk.recv(1024).decode('utf-8') print(ret) if ret == 'bye': sk.send(b'bye') break sk.close()
client2代码:


import socket sk = socket.socket() sk.connect(('127.0.0.1',8080)) while True: info = input('>>>') if info == 'bye': sk.send(b'bye') break sk.send(('client2:'+info).encode('utf-8')) ret = sk.recv(1024).decode('utf-8') print(ret) if ret == 'bye': sk.send(b'bye') break sk.close()
udp协议:能同时与多个客户端通信
udp的server下,不需要进行监听也不需要建立连接
在启动服务之后只能被动的等待客户端发送消息过来
在客户端发送消息的时候会自带地址信息
消息回复的时候 不仅需要发送消息,还需要把对方的地址发过去
server端


import socket sk = socket.socket(type=socket.SOCK_DGRAM) sk.bind(('127.0.0.1',8080)) while True: msg,addr = sk.recvfrom(1024) print(addr) print(msg.decode('utf-8')) info = input('>>>').encode('utf-8') sk.sendto(info,addr) sk.close()
client1端


import socket sk = socket.socket(type=socket.SOCK_DGRAM) ip_port = ('127.0.0.1',8080) while True: info = input('>>>') info = ('\033[31m来自1号选手的消息:{}\033[0m'.format(info)).encode('utf-8') sk.sendto(info,ip_port) msg,addr = sk.recvfrom(1024) print(msg.decode('utf-8')) sk.close()
client2端


import socket sk = socket.socket(type=socket.SOCK_DGRAM) ip_port = ('127.0.0.1',8080) while True: info = input('>>>') info = ('\033[32m来自1号选手的消息:{}\033[0m'.format(info)).encode('utf-8') sk.sendto(info,ip_port) msg,addr = sk.recvfrom(1024) print(msg.decode('utf-8')) sk.close()