初始socket模块
Serve端代码
import socket sk = socket.socket() #默认为TCP连接 """socket 里面两个方法 family=AF_INET:服务器之间的通信 family=AF_UNIX:Unix不同进程间的通信 SOCK_STREAM: TCP连接 SOCK_DGRAM:UDP连接 """ address =("127.0.0.1", 8000)#IP地址和端口号(端口号1024以后随便用) sk.bind(address)#绑定IP地址和端口号 sk.listen(3)#3个连接等待,多的连接不上 conn, addr = sk.accept() #返回连接的对象,和address 连接对象的IP和端口号 #conn 是客户端的conn 最重要最关键的参数 """ recv()接收 send()发送 sendall()全发送,使劲发 """ inp = input(">>>") conn.send(bytes(inp,"utf8"))#3.x之后的版本都是默认发送beytes类型 #所以要按照utf8的格式转换成beytes在发送
Client客户端代码
import socket sk = socket.socket() address =("127.0.0.1", 8000) #准备连接的IP和端口号 sk.connect(address)#建立连接,里面输入IP和端口号 data = sk.recv(1024)#接收数据多少,这里的概念有点模糊。。。 print(str(data,"utf8"))#接收过来的数据也要通过uft8格式转换成str
无限制聊天代码更新
Serve端代码
#!/usr/bin/python # -*- coding:utf-8 -*- import socket sk = socket.socket()#创建网络 address = ("192.168.10.197", 8000)#IP和端口 sk.bind(address)#绑定IP和端口 sk.listen(3)#等待中的进程 while 1 : print("等待连接...........") conn, addr = sk.accept()#返回连接的信息 print("有一个连接成功") while 1: try: data = conn.recv(1024) except: print("目标强制退出,已经断开连接") break if not data: print("目标已退出");break print(str(data, "utf8")) inp = input("请输入你要发送的内容:") conn.send(bytes(inp, "utf8"))#发送
Client客户端代码
#!/usr/bin/python # -*- coding:utf-8 -*- import socket sk = socket.socket() address = ("192.168.10.197", 8000) sk.connect(address) while 1: inp = input("请输入你要发送的内容:") if not inp: print("请不要输入空内容!") inp = input("请输入你要发送的内容:") elif inp == "退出": break sk.send(bytes(inp, "utf8")) data = sk.recv(1024) print(str(data, "utf8"))
远程执行代码
Serve端代码
#!/usr/bin/python # -*- coding:utf-8 -*- import socket import subprocess #还没学过,找之前视频教程学习 sk = socket.socket()#创建网络 address = ("192.168.10.197", 8000)#IP和端口 sk.bind(address)#绑定IP和端口 sk.listen(3)#等待中的进程 while 1: print("等待连接...........") conn, addr = sk.accept()#返回连接的信息 print("有一个连接成功") while 1: try: data = conn.recv(1024) except: print("目标强制退出,已经断开连接") break if not data: print("目标已退出"); break #远程执行命令 obj = subprocess.Popen(str(data, "utf8"), shell=True, stdout=subprocess.PIPE)#加上stdout把这个变成子程序对象赋予给obj,传入数据要是utf8 cmd_result = obj.stdout.read()#运行之前传入的命令 result_len = bytes(str(len(cmd_result)), "utf8")#把得到的数据len保存变量先传过去 #内容太大,一次性发布送不完 #通过len大小来判断是否接收完毕 conn.sendall(result_len)#发送数据大小 """黏包现象,会把下面的黏带过去""" conn.recv(1024) """以上是解决方法""" conn.sendall(cmd_result)#发送cmd执行后的内容
Client客户端代码
#!/usr/bin/python # -*- coding:utf-8 -*- import socket sk = socket.socket() address = ("192.168.10.197", 8000) sk.connect(address) while 1: inp = input("请输入你要发送的内容:") if not inp: print("请不要输入空内容!") inp = input("请输入你要发送的内容:") elif inp == "退出": break sk.send(bytes(inp, "utf8"))#发送过去一个命令 result_len = int(str(sk.recv(1024), "utf8"))#从接收过来的bytes类型转换成int sk.sendall("ok")#解决黏包问题 data = bytes()#创建一个空的bytes类型 while result_len != len(data):#判断接收过来的数据大小是否等于发送的数据大小 recv = sk.recv(1024) data += recv print(str(data, "gbk"))
上传文件代码
Serve端代码
#!/usr/bin/python # -*- coding:utf-8 -*- import socket import os import subprocess #还没学过,找之前视频教程学习 sk = socket.socket()#创建网络 address = ("192.168.10.197", 8000)#IP和端口 sk.bind(address)#绑定IP和端口 sk.listen(3)#等待中的进程 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) #求出绝对路径 while 1: print("等待连接...........") conn, addr = sk.accept() while 1: #返回连接的信息 print("有一个连接成功") #接收上传文件 info_recv = conn.recv(1024)#接收第一个包装信息 info_recv = str(info_recv,"utf8") filename, filesize = info_recv.split("|")#解析包装信息 filesize = int(filesize)#把字符串的filesize转换成int整数型 path = os.path.join(BASE_DIR, "serve", filename)#要输入的文件路径和文件名拼接 with open(path, "wb") as f: info_size = 0 while info_size != filesize:#判断接收文件大小是否符合 print("正在接收...") data = conn.recv(1024) f.write(data) info_size += len(data)
Client客户端代码
#!/usr/bin/python # -*- coding:utf-8 -*- import socket import os sk = socket.socket() address = ("192.168.10.197", 8000) sk.connect(address)#连接 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) #求出绝对路径 while 1: inp = input("请输入你要发送的内容:").strip()#post上传命令|文件名,去掉换行符等一切空格 #自己用就不进行判断输入是否合法了 cmd, filename = inp.split("|")#解析文件的命令和文件名 print(cmd, filename) path = os.path.join(BASE_DIR, filename)#绝对路径加上文件名 filesize = os.stat(path).st_size #求出文件大小 print(filesize) info_file = "%s|%s"%(filename,filesize)#包装两个信息到一起(文件名+文件大小)发送过去 sk.sendall(bytes(info_file, "utf8"))#发送 info_size = 0#定义一个空变量 with open(path, "rb") as f:#读取文件 while info_size != filesize:#循环发送 print("正在发送") data = f.read(1024)#每次读取1024字节 sk.sendall(data)#发送文件 info_size += len(data)#累加文件大小 print("恭喜您,上传完成!")