socket 套接字、 socketserver
网络编程
socket (TCP、IP) 套接字

服务端:
1.运行,等待客户端连接
import socket sk = socket.socket() sk.bind(('127.0.0.1', 8080,)) #IP 和端口用元组表示 sk.listen(5) #监听 while True: conn, address = sk.accept() #接收客户端的请求,会阻塞 print(conn, address) #conn,address 来连接客户端的信息
客户端:
import socket obj = socket.socket() obj.connect(('127.0.0.1', 8080,)) #连接服务器,connect 传输的参数是元组 obj.close()
聊天机器人服务端:
import socket sk = socket.socket() sk.bind(('127.0.0.1', 8080,)) #IP 和端口用元组表示 sk.listen(5) #监听 while True: conn, address = sk.accept() #接收客户端的请求,会阻塞 conn.sendall(bytes( 'Welcome to Oldboy', encoding='utf-8')) #Python3.0 默认传字节,需要转换。Python2.0 默认传字符串 while True: ret_bytes = conn.recv(1024) ret_str = str(ret_bytes,encoding='utf-8') if ret_str == 'q': break conn.sendall(bytes(ret_str + 'Welcome to Oldboy', encoding='utf-8')) print(conn, address) #conn,address 来连接客户端的信息
聊天机器人客户端:
import socket obj = socket.socket() obj.connect(('127.0.0.1', 8080,)) # 连接服务器,connect 传输的参数是元组 # recv也是阻塞的 ret_bytes = obj.recv(1024) #接收信息,1024表示一次最多接收1024字节 ret_str = str(ret_bytes, encoding='utf-8') print(ret_str) while True: inp = input("请输入要发送的内容") obj.sendall(bytes( inp, encoding='utf-8')) if inp == 'q': break else: ret = str( obj.recv(1024), encoding='utf-8') print(ret) obj.close()
socket 的更多方法。





FTP:
Ftp服务器:
1 import socket 2 sk = socket.socket() 3 sk.bind(('127.0.0.1', 9999)) 4 sk.listen(5) 5 6 while True: 7 conn, address = sk.accept() #accept阻塞 8 conn.sendall(bytes("欢迎登陆Free_FTP", encoding='utf-8')) 9 #先接收文件大小,然后再开始接收文件 10 file_size = str(conn.recv(1024),encoding='utf-8') 11 print(file_size) 12 total_size = int(file_size) 13 has_recv = 0 14 f = open('new.png', 'wb') 15 #接收文件内容,直到获取完毕 16 while True: 17 if total_size == has_recv: 18 break 19 data = conn.recv(1024) 20 f.write(data) 21 has_recv += len(data) 22 23 f.close()
Ftp客户端:
1 import socket 2 import os 3 obj = socket.socket() 4 obj.connect(('127.0.0.1', 9999)) 5 #阻塞 6 ret_bytes = obj.recv(1024) 7 ret_str =str(ret_bytes,encoding='utf-8') 8 print(ret_str) 9 #发送当前文件大小 10 size = os.stat('f.png').st_size 11 obj.sendall(bytes(str(size), encoding='utf-8')) 12 13 #发送文件 14 with open('f.png', 'rb') as f: 15 for line in f: 16 obj.sendall(line) 17 18 obj.close()
改良Ftp服务器-----发送文件大小后确认接收到文件大小。在传送文件>>>>>>>解决粘包问题。
1 import socket 2 sk = socket.socket() 3 sk.bind(('127.0.0.1', 9999)) 4 sk.listen(5) 5 6 while True: 7 conn, address = sk.accept() #accept阻塞 8 conn.sendall(bytes("欢迎登陆Free_FTP", encoding='utf-8')) 9 #先接收文件大小,然后再开始接收文件 10 file_size = str(conn.recv(1024),encoding='utf-8') 11 conn.sendall(bytes('ack', encoding='utf-8')) 12 print(file_size) 13 total_size = int(file_size) 14 has_recv = 0 15 16 f = open('new.png', 'wb') 17 #接收文件内容,直到获取完毕 18 while True: 19 if total_size == has_recv: 20 break 21 data = conn.recv(1024) 22 f.write(data) 23 has_recv += len(data) 24 25 f.close()
Ftp客户端
1 import socket 2 import os 3 obj = socket.socket() 4 obj.connect(('127.0.0.1', 9999)) 5 #阻塞 6 ret_bytes = obj.recv(1024) 7 ret_str =str(ret_bytes,encoding='utf-8') 8 print(ret_str) 9 #发送当前文件大小 10 size = os.stat('f.png').st_size 11 obj.sendall(bytes(str(size), encoding='utf-8')) 12 obj.recv(1024) 13 #发送文件 14 with open('f.png', 'rb') as f: 15 for line in f: 16 obj.sendall(line) 17 18 obj.close()
socketserver:
并发处理多个客户端请求
使用:
1、创建类,必须继承
2、handle 方法
3、server_forever
1 import socketserver 2 class MyServer(socketserver.BaseRequestHandler): 3 4 def handle(self): 5 conn = self.request 6 conn.sendall(bytes("welcome", encoding='utf-8')) 7 while True: 8 ret_bytes = conn.recv(1024) 9 ret_str = str(ret_bytes, encoding='utf-8') 10 if ret_str == 'q': 11 break 12 conn.sendall(bytes(ret_str+"hao", encoding='utf-8')) 13 14 15 if __name__ == '__main__': 16 server = socketserver.ThreadingTCPServer(('127.0.0.1', 9998), MyServer) 17 server.serve_forever()

长期作业
Tornado
手动安装 :下载tornado-1.2.1.tar.gz



浙公网安备 33010602011771号