Socketserver
客户端:
import socket
address = ('127.0.0.1',4000) import socket sk = socket.socket() sk.connect(address) inp_str = input('输入') sk.sendall(bytes(inp_str,encoding='utf-8')) result = str(sk.recv(1023),encoding='utf-8') print(result) sk.close()
#输入 ABC >>> ABC好
服务端
HOST = '' PORT = 4000 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) s.listen(10) print('Socket now listening') conn, addr = s.accept() data = str(conn.recv(1024),encoding='utf-8') print('data = ',data) conn.sendall(bytes(data+'好',encoding='utf-8')) conn.close() s.close()
>>>Socket now listening >>> ABC
因为客户端的 一个connect 对应一个服务端的 accept ,上边的代码在完成一次响应之后服务器立即断开了连接,而我们平常访问的网站是一直等待接收连接的。所以我们要将服务器的代码更改一下让它可以一直接收连接,我们可以把accept放到一个循环中,然后再把代码改写成可以自动回复的Demo。
客户端:
import socket address = ('127.0.0.1',7777) sk = socket.socket() sk.connect(address) while True: inp_str = input('输入') sk.sendall(bytes(inp_str,encoding='utf-8')) result = str(sk.recv(1023),encoding='utf-8') print(result)
服务端(保持服务):
import socket HOST = '' PORT = 6666 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) s.listen(10) print('Socket now listening') while True: # wait to accept a connection - blocking call conn, addr = s.accept() while True: data = str(conn.recv(1024),encoding='utf-8') print('data = ',data) if data == 'q': break conn.sendall(bytes(data+'yes',encoding='utf-8')) conn.close() s.close()
运行修改后的代码就可以实现服务器保持服务的功能了 。
因为是属于循环自动聊天和回复的功能,只有客户端发送' q '的时候,其他客户端才可以进行链接,这样虽然保持了服务器可以持续接收请求,但却是一个用户断开,另一个用户才可以连接。
其实要实现这个功能,就要用到python的多线程。
但是,python中的 socketserver 已经帮我们实现了这个需求。
socketserver:
服务端代码更改为:
import socketserver class My_socket(socketserver.BaseRequestHandler): def handle(self): conn = self.request while True: data = str(conn.recv(1024), encoding='utf-8') print('data = ', data) if data == 'q': break conn.sendall(bytes(data + 'yes', encoding='utf-8')) if __name__ == '__main__': server = socketserver.ThreadingTCPServer(('127.0.0.1',8888),My_socket) server.serve_forever()
这样运服务端代码,就可以多个客户端同事访问了。