初始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("恭喜您,上传完成!")

Serve端代码

Client客户端代码

最新文章

  1. openstack上创建vm实例后,状态为ERROR问题解决
  2. 转:在Android中使用AlarmManager
  3. Codeforces 740A. Alyona and copybooks 模拟
  4. jpa 注解使用说明
  5. python执行mysqldump命令
  6. iOS 判断设备是否越狱
  7. C:\Program Files\Java\jdk1.7.0_79\bin\java.exe'' finished with non-zero exit value 1
  8. vs 快捷操作
  9. git入门 多人协作
  10. 安装Window 10系统------计算机经验
  11. java 序列化和反序列化的实现原理
  12. Tomcat介绍、安装jdk、安装Tomcat、配置Tomcat监听80端口
  13. Linux rm命令详解
  14. Android notifyDataSetChanged
  15. The way to Go(7): 常量
  16. vue-cli 下的 webpack 优化
  17. 面试总结之C/C++
  18. 【bzoj 2716】[Violet 3]天使玩偶 (CDQ+树状数组)
  19. 对于GTPv1协议头部的解析
  20. spring框架所有包说明

热门文章

  1. mac 下安装Anaconda Python
  2. cacheed 限制 4节点 3000万 es 批量删除 shell脚本练习 elasticsearch_action
  3. uploadify3.2.1版插件在ASP.NET中的使用
  4. bzoj 1367 [ Baltic 2004 ] sequence —— 左偏树
  5. java replaceAll 忽略大小写
  6. E20170919-hm
  7. CSS样式适配杂记
  8. 【Leetcode 220】 Contains Duplicate III
  9. 兼容浏览器 div固定浏览器窗口底部 浮动div
  10. 检查阿里云ssl证书到期情况