一 .套接字TCP协议
1. 基于TCP协议的socket
TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、
面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。
注意: tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端
server端1
import socket sk = socket.socket() sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字 sk.listen() #监听链接 conn,addr = sk.accept() #接受客户端链接 ret = conn.recv(1024) #接收客户端信息 print(ret) #打印客户端信息 conn.send(b'hi') #向客户端发送信息 conn.close() #关闭客户端套接字 sk.close() #关闭服务器套接字(可选)
client端1
import socket sk = socket.socket() # 创建客户套接字 sk.connect(('127.0.0.1',8898)) # 尝试连接服务器 sk.send(b'hello!') ret = sk.recv(1024) # 对话(发送/接收) print(ret) sk.close() # 关闭客户套接字
解决方法
#加入一条socket配置,重用ip和端口 import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket.socket() sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加 sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字 sk.listen() #监听链接 conn,addr = sk.accept() #接受客户端链接 ret = conn.recv(1024) #接收客户端信息 print(ret) #打印客户端信息 conn.send(b'hi') #向客户端发送信息 conn.close() #关闭客户端套接字 sk.close() #关闭服务器套接字(可选)
TCP案例
1.
server import socket sk=socket.socket() # 买手机 sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 避免服务重启时 侯报错 端口地址错误 sk.bind(("127.0.0.1",8081))# 绑定手机卡 sk.listen() # 监听 意思就是等别人给我打电话 conn,addr =sk.accept() # 接受到别人的电话 conn 链接 addr 地址 while True: ret=conn.recv(1024).decode("utf-8") if ret=='bye': break print(ret) aa = input("服务器>>>:") conn.send(bytes(aa,encoding="utf-8")) conn.close() # 挂电话 sk.close() # 关机
client import socket sk=socket.socket() # 买手机 sk.connect(("127.0.0.1",8081)) # 拨通人的号 while True: bb=input("客服端>>>:") sk.send(bytes(bb,encoding="utf-8")) ret=sk.recv(1024).decode("utf-8") print(ret) if ret=='bye': sk.send(b'bye') break sk.close()
2.
server import socket sk=socket.socket() # 买手机 sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 避免服务重启时 侯报错 端口地址错误 sk.bind(("127.0.0.1",8081))# 绑定手机卡 sk.listen() # 监听 意思就是等别人给我打电话 conn,addr =sk.accept() # 接受到别人的电话 conn 链接 addr 地址 while True: ret=conn.recv(1024) # 听别人说话 print(ret) conn.send(b'lover supreme') # 和别人说化 必须传一个bytes类型 ret=conn.recv(1024) print(ret.decode("utf-8")) # 接收客服端信息解码 conn.send(bytes('吃冒菜啊哈哈',encoding="utf-8")) # 发送信息到客服端 编码 conn.close() # 挂电话 sk.close() # 关机
client
import socket sk=socket.socket() # 买手机 sk.connect(("127.0.0.1",8081)) # 拨通人的号 while True: sk.send(b'suoaaaaa') ret=sk.recv(1024) print(ret) sk.send(bytes('今天中午吃什么'.encode('utf-8'))) #发送到服务器 编码 ret=sk.recv(1024) print(ret.decode('utf-8')) # 接收到服务器端的信息解码 sk.close()
3.
server import socket from socket import SOL_SOCKET,SO_REUSEADDR server=socket.socket() server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) server.bind(("192.168.59.1",8400)) server.listen(5) while True: conn,addr=server.accept() while True: date=conn.recv(1024).decode("utf-8") user,pwd=date.split("|") with open("aa.txt","r")as f1: for line in f1: us,pw=line.strip().split(':') if us==user and pwd==pw: conn.send("成功了".encode("utf-8")) else: conn.send("失败了".encode("utf-8"))
client import socket client=socket.socket() client.connect(("192.168.59.1",8400)) while True: user=input("请输入的用户名:") pwd=input("请输入你的密码:") val="%s|%s"%(user,pwd) client.send(val.encode("utf-8")) date=client.recv(1024).decode("utf-8") print(date) client.close()