8.基于socket开发一个聊天程序,实现两端互相发送和接收消息
服务端
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind(("127.0.0.1",8888))
phone.listen(5)
conn,client_addr = phone.accept()
while True:
try:
rec_data=conn.recv(1024)
if not rec_data:break
print("client回复:%s" %rec_data.decode("utf-8"))
msg = input("sever输入:").strip()
print("waiting...")
send_data = conn.send(msg.encode("utf-8"))
except ConnectionResetError:
break
conn.close()
phone.close()
客户端
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(("127.0.0.1",8888))
while True:
msg = input("client输入:").strip()
if not msg:break
phone.send(msg.encode("utf-8"))
print("waiting...")
rec_data = phone.recv(1024)
print("sever回复:%s" %rec_data.decode("utf-8"))
phone.close()
9.基于tcp socket,开发简单的远程命令执行程序,允许用户执行命令,并返回结果
服务端
import socket
import subprocess
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind(('127.0.0.1',8081))#0-1024操作系统用
phone.listen(5)
print("starting")
while True:
conn,client_addr = phone.accept()
print(client_addr)
while True: #通信循环
try:
data = conn.recv(1024) #1.单位:bytes 2.最大接收1024个bytes
if not data:break #适用于linux操作系统
obj = subprocess.Popen(data.decode("utf-8"),shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout = obj.stdout.read()
stderr = obj.stderr.read()
conn.send(stdout+stderr)
except ConnectionResetError: #适用于windows操作系统
break
conn.close()
phone.close()
客户端
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('127.0.0.1',8081))#0-1024操作系统用
while True:
msg = input(">>:").strip()
phone.send(msg.encode("utf-8"))
if not msg:
continue
data = phone.recv(1024)
print("has recv:")
print(data.decode("gbk"))
phone.close()
10.基于tcp协议编写简单FTP程序,实现上传、下载文件功能,并解决粘包问题
服务端
import socket
import subprocess
import struct
import json
import os
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
phone.bind(('127.0.0.1',8081))#0-1024操作系统用
phone.listen(5)
print("starting")
path = os.path.dirname(__file__)
share_path = os.path.join(
path,"share"
)
def get(cmds,conn):
filename = cmds[1]
# print(filename)
header_dict = {
"filename":filename,
"md5":"5558888",
"file_size":os.path.getsize(r"%s/%s" %(share_path,filename))
}
print(header_dict)
header_json = json.dumps(header_dict)
header_bytes = header_json.encode("utf-8")
# print(header_bytes)
conn.send(struct.pack("i",len(header_bytes)))
conn.send(header_bytes)
with open("%s/%s" %(share_path,filename),"rb") as f:
for line in f:
conn.send(line)
def put(cmds,conn):
obj = conn.recv(4)
header_size = struct.unpack("i",obj)[0]
header_bytes = conn.recv(header_size)
header_json = header_bytes.decode("utf-8")
header_dict = json.loads(header_json)
file_size = header_dict["file_size"]
filename = header_dict["filename"]
with open("%s/%s" %(share_path,filename),"wb") as f:
recv_size = 0
while recv_size < file_size:
line = conn.recv(1024)
f.write(line)
recv_size += len(line)
print(f"总大小:{file_size},收到大小:{recv_size}")
def run():
while True:
conn,client_addr = phone.accept()
print(client_addr)
while True: #通信循环
try:
res = conn.recv(1024) #1.单位:bytes 2.最大接收1024个bytes
if not res:break #适用于linux操作系统
cmds = res.decode("utf-8").split()
print(cmds)
if cmds[0] == "get":
get(cmds,conn)
elif cmds[0] == "put":
put(cmds,conn)
except ConnectionResetError: # 适用于windows操作系统
break
conn.close()
phone.close()
if __name__ == '__main__':
run()
客户端
import socket
import struct
import json
import os
path = os.path.dirname(__file__)
download_path = os.path.join(
path,"download"
)
def get(phone):
print(phone)
obj = phone.recv(4)
header_size = struct.unpack("i", obj)[0]
header_bytes = phone.recv(header_size)
header_json = header_bytes.decode("utf-8")
header_dict = json.loads(header_json)
total_size = header_dict["file_size"]
filename = header_dict["filename"]
with open("%s/%s" % (download_path, filename), "wb") as f:
recv_size = 0
while recv_size < total_size:
line = phone.recv(1024)
f.write(line)
recv_size += len(line)
print(f"总大小{total_size},已下载大小:{recv_size}")
def put(phone,filename):
header_dict = {
"filename":filename,
"md5":"05556",
"file_size":os.path.getsize("%s/%s" %(download_path,filename))
}
header_json = json.dumps(header_dict)
header_bytes = header_json.encode("utf-8")
phone.send(struct.pack("i",len(header_bytes)))
phone.send(header_bytes)
with open("%s/%s" %(download_path,filename),"rb") as f:
for line in f:
phone.send(line)
def run():
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('127.0.0.1',8081))#0-1024操作系统用
while True:
inp = input(">>:").strip()
phone.send(inp.encode("utf-8"))
if not inp:
continue
cmds = inp.split()
filename = cmds[1]
if cmds[0] == "get":
get(phone)
elif cmds[0] == "put":
put(phone,filename)
else:
print("no")
# print(cmds)
phone.close()
if __name__ == '__main__':
run()
11.基于udp协议编写程序,实现功能
执行指定的命令,让客户端可以查看服务端的时间
执行指定的命令,让客户端可以与服务的的时间同步
服务端
from socket import *
import time
sever = socket(AF_INET,SOCK_DGRAM)
sever.bind(("127.0.0.1",8888))
while True:
data,client_addr = sever.recvfrom(1024)
print("recv:{}".format(data.decode("utf-8")))
if data:
print("start send to sever time")
sever_time = time.strftime("%Y-%m-%d %H-%M-%S",time.localtime())
sever.sendto(sever_time.encode("utf-8"),client_addr)
else:
print("connect is lost")
break
sever.close()
客户端
from socket import *
import time
client = socket(AF_INET,SOCK_DGRAM)
while True:
msg = input(">>:").strip()
if not msg:continue
client.sendto(msg.encode("utf-8"),("127.0.0.1",8888))
data, sever_addr = client.recvfrom(1024)
print("sever time:{}".format(data.decode("utf-8")))
print("local time:{}".format(time.strftime("%Y-%m-%d %H-%M-%S",time.localtime())))
client.close()