前一段是研究epool进行socket链接 一方面可能是本人不精通出现一些小BUG(就使用不顺手) 另一方面则是携程没有具体使用过则最近研究python官方文档给予的携程链接 先奉上代码 等研究差不多则可提供大家使用
首先是server端
import asyncio
from threading import Thread
# 创建一个公共方法 用来存放客户端的文件地址 或者说是连接对象
server_dic = {}
# 创建一个类 并且继承asyncio的接受子类
class EchoServerProtocol(asyncio.Protocol):
def connection_made(self, transport):
# peername 这个是官方文档的指定传参方式获取远程链接地址(也就是说客户端的地址 其类型为元组)
peername = transport.get_extra_info('peername')
# 我这里用方法将此链接名字作为建而当前连接符也就是当前的文件对象或socket客户端对象作为值
server_dic.update(
{
str(peername): transport
}
)
# 该方法继承asyncio的接受方法
def data_received(self, data):
message = data.decode()
print('我是发送过来的消息: {!r}'.format(message))
# 启动该套接字对象的主函数
async def main():
loop = asyncio.get_running_loop()
server = await loop.create_server(
lambda: EchoServerProtocol(),
'127.0.0.1', 8888)
async with server:
await server.serve_forever()
# 作为线程开启的函数
def thread_main():
asyncio.run(main())
t = Thread(target=thread_main)
t.daemon = True
t.start()
c = 1
# 一些简单操作
while c:
msg = input()
if msg == "quit":
c = 0
elif msg == "q":
print(server_dic)
elif msg == "w":
conn = input()
server = server_dic.get(conn)
print(server)
print(dir(server))
server.write(b"123")
elif msg == "e":
conn = input()
server = server_dic.get(msg)
server.close()
其次是client端
from socket import *
def main():
# 1.创建tcp_client_socket 套接字对象
tcp_client_socket = socket(AF_INET, SOCK_STREAM)
# 作为客户端,主动连接服务器较多,一般不需要绑定端口
# 2.连接服务器
tcp_client_socket.connect(("127.0.0.1", 8888))
while True:
"""无限循环可以实现无限聊天"""
# 3.向服务器发送数据
meg = input("请输入要发送的消息:")
tcp_client_socket.send(meg.encode())
# 在linux中默认是utf-8编码
# 在udp协议中使用的sendto() 因为udp发送的为数据报,包括ip port和数据, # 所以sendto()中需要传入address,而tcp为面向连接,再发送消息之前就已经连接上了目标主机
# 4.接收服务器返回的消息
recv_data = tcp_client_socket.recv(1024)
if recv_data:
print("返回的消息为:", recv_data.decode('gbk'))
else:
print("对方已离线。。")
break
tcp_client_socket.close()
if __name__ == '__main__':
main()