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()
注意:消息的传输都是字符串形式,需要注意数据类型之间的转换