socket:
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
基于TCP协议的socket:tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端
server服务端:
#server服务端 import socket sk = socket.socket() #创建服务套接字 sk.bind(('127.0.0.1',8080)) #把地址绑定到套接字 sk.listen() #建立监听链接,能否建立需要accept函数去进行检查 conn,addr = sk.accept() #接收客户端链接,接收值分别为客户端套接字对象与地址信息 ret = conn.recv(1024).decode('utf-8') #接收客户端消息 print(ret) #打印客户端消息 conn.send(bytes('你好',encoding='utf-8')) #用接收到的客户端套接字给客户端发送消息 conn.close() #关闭客户端套接字 sk.close() #关闭服务器套接字(可选)
client用户端:
import socket sk = socket.socket() #创建客户套接字 sk.connect(('127.0.0.1',8080)) #尝试连接服务器 sk.send(bytes('很高兴认识你',encoding='utf-8')) #发送消息 ret = sk.recv(1024).decode('utf-8') #接收消息 print(ret) #打印消息 sk.close() #关闭客户套接字
注意:服务端的accept接收客户端的连接请求,返回一个新的用户端套接字对象,和一个地址信息,新的用户端套接字用于接收或者传输消息。服务端用bind绑定地址到套接字,而用户端用connect连接服务器。
测试1:
#假装在聊天 #server: import socket sk = socket.socket() sk.bind(('127.0.0.1',8081)) sk.listen() conn,addr = sk.accept() while True: ret = conn.recv(1024).decode('utf-8') print(ret) if ret == 'cool:bye': conn.send(bytes('柚柚柚切克闹:bye',encoding='utf-8')) break info = input('柚柚柚切克闹:') conn.send(bytes('柚柚柚切克闹:%s'%(info),encoding='utf-8')) conn.close() sk.close() #client: import socket sk = socket.socket() sk.connect(('127.0.0.1',8081)) while True: chat = input('cool:') sk.send(bytes('cool:%s'%(chat),encoding='utf-8')) ret = sk.recv(1024).decode('utf-8') print(ret) if ret == '柚柚柚切克闹:bye': sk.send(bytes('cool:bye',encoding='utf-8')) break sk.close()
测试2:
每隔十秒用户端向服务端发送一个时间戳,服务端接收后给用户端返回一个格式化的时间
#server: import socket,time sk = socket.socket() sk.bind(('127.0.0.1',8081)) sk.listen() conn,addr = sk.accept() while True: ret = conn.recv(1024).decode('utf-8') print(ret) info_ret = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(int(ret))) #需要把字符串强转为整型 conn.send(bytes(str(info_ret),encoding='utf-8')) conn.close() sk.close() #client import socket,time sk = socket.socket() sk.connect(('127.0.0.1',8081)) while True: time.sleep(10) timer = int(time.time()) #时间戳返回值为float,需要转换成整型 sk.send(bytes(str(timer),encoding='utf-8'))#只能传bytes类型,而消息的传输都是以字符串的形式 ret = sk.recv(1024).decode('utf-8') print(ret) sk.close()
注意:消息的传输都是字符串形式,需要注意数据类型之间的转换