Python学习笔记(12)socket

socket三个例

1.客户端与服务端互发消息

import socket

sk = socket.socket()

address = ('127.0.0.1', 8000)
sk.connect(address)

while True:
inp = input('>>>')
if inp == 'exit':
break
sk.send(bytes(inp, 'utf8'))
data = sk.recv(1024)
print(str(data, 'utf8'))

sk.close()

import socket

sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('127.0.0.1', 8000)
sk.bind(address)
sk.listen(3)

print('waiting...')

while True:
conn, addr = sk.accept()
print(addr)
while True:
try:
data = conn.recv(1024)
except Exception:
break
if not data:
break
print(str(data, 'utf8'))
inp = input('>>>')
conn.send(bytes(inp, 'utf-8'))

sk.close()

2.客户端发送文件到服务端
import socket
import os

sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.connect(address)

Base_DIR = os.path.dirname(os.path.abspath(__file__))

while True:
inp = input('>>>') # 传入post与文件名
cmd, path = inp.split('|')
path = os.path.join(Base_DIR, path) # 拼接路径
filename = os.path.basename(path) # 获取文件名
print(filename)
file_size = os.stat(path).st_size # 计算文件大小

file_info = 'post|%s|%s' % (filename, file_size)
sk.sendall(bytes(file_info, 'utf8'))

with open(path, 'rb') as f:

has_sent = 0
while has_sent != file_size:
data = f.read(1024)
sk.sendall(data)
has_sent += len(data)
print('上传成功')
sk.close()

import socket
import os

sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.bind(address)
sk.listen(3)

print('waiting...')

Base_DIR = os.path.dirname(os.path.abspath(__file__))

while True:
conn, addr = sk.accept()
while True:
data = conn.recv(1024)
cmd, filename, file_size = str(data, 'utf8').split('|')
path = os.path.join(Base_DIR, 'image', filename)
file_size = int(file_size)
has_receive = 0
with open(path, 'ab') as f:
while has_receive != file_size:
data = conn.recv(1024)
f.write(data)
has_receive += len(data)

sk.close()

3.客户端发送cmd命令到服务端执行并返回

客户端
import socket

sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.connect(address)

while True:
inp = input('>>>')
if inp == 'exit':
break
sk.send(bytes(inp, 'utf8'))
result_len = int(str(sk.recv(1024), 'utf8'))
sk.send(b'ok')
print(result_len)
data = bytes()

while len(data) != result_len:
data += sk.recv(1024)
print(str(data, 'gbk'))

sk.close()

服务端
import socket
import subprocess

sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.bind(address)
sk.listen(3)

while True:
conn, addr = sk.accept()
print(addr)
while True:
try:
data = conn.recv(1024)
except Exception:
break
if not data:
break
print(str(data, 'utf8'))

obj = subprocess.Popen(str(data, 'utf-8'), shell=True, stdout=subprocess.PIPE)
cmd_result = obj.stdout.read()
result_len = bytes(str(len(cmd_result)), 'utf8')
conn.send(result_len)
conn.recv(1024)
conn.send(cmd_result)

sk.close()
socketserver
socketserver


class Myserver(socketserver.BaseRequestHandler):
def handle(self):...


if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1', 8000), Myserver)
server.serve_forever()

posted on 2018-04-24 18:05  童话与海  阅读(110)  评论(0)    收藏  举报

导航