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

 

posted @ 2019-06-25 22:56  Freechen0  阅读(99)  评论(0)    收藏  举报