socket 网络编程笔记 一
初始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客户端代码
socket 网络编程笔记 一的更多相关文章
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- Linux网络编程笔记(修订版)
我的网络编程笔记, 因为最近又要做Linux下的网络编程,故重新修订, 其中一些内容参考了文末的链接及文章 1. 基本概念 2. 基本接口 2.1. 打开一个socket 2.2. 将 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- Python全栈【Socket网络编程】
Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...
- python之Socket网络编程
什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...
- Python之路【第七篇】python基础 之socket网络编程
本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket 网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...
- Socket网络编程-基础篇
Socket网络编程 网络通讯三要素: IP地址[主机名] 网络中设备的标识 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址 有效端口:0~65535 其 ...
- Socket网络编程--FTP客户端
Socket网络编程--FTP客户端(1)(Windows) 已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解F ...
- windows下的socket网络编程
windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...
随机推荐
- linux系统下用到的小知识点积累
preface:在ubuntu下做事情,在终端下执行一些命令.或者在vim里面做一些操作.自然而然须要用到一些小知识点,没有怎么系统地看<鸟哥的菜>,基本上是遇到了什么问题想要实现什么功能 ...
- 20170620_javaweb_小结
01.session失效的方式 02. session和cookie的区别 03.jsp九大内置对象,意义 以及对应的java类 04.转发和重定向 05.jsp的执行过程 和 生命周期 06.实现s ...
- Windows的所有风格与扩展风格
SetWindowLonghttp://msdn.microsoft.com/en-us/library/windows/desktop/ms633591(v=vs.85).aspxWindow St ...
- 洛谷 P4149 [ IOI 2011 ] Race —— 点分治
题目:https://www.luogu.org/problemnew/show/P4149 仍然是点分治: 不过因为是取 min ,所以不能用容斥,那么子树之间就必须分开算,记录桶时注意这个: 每次 ...
- PCB CE工具取Genesis JOB与STEP内存地址 方法分享
今天无意中在硬盘上找到了<CE工具取Genesis JOB与STEP内存地址 >视频, 这是2013年初由郭兄(永明)远程时录制的一段视频,特别感谢郭兄指引与帮助, 想当初要不是你推出全行 ...
- P4280 [AHOI2008]逆序对
传送门 有一个不会证明的贪心:从左到右考虑每一个位置,然后在每一个位置都贪心选取能让该位置构成的逆序对最少的数.判断逆序对的话只要记一下前缀小于等于某数的总数和后缀小于等于某数的总数就行了 //min ...
- php自动加载的两个函数__autoload和__sql_autoload_register
一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: printit.class.php //文件 <?php class P ...
- [Apple开发者帐户帮助]六、配置应用服务(5.2)推送通知(APN):使用TLS证书与APN通信
您的通知服务器可以使用TLS证书与Apple推送通知服务(APN)通信. 首先在开发者帐户中启用推送通知.接下来生成适用于开发和生产环境的APNs客户端TLS证书.然后从Mac导出客户端TLS标识并将 ...
- IT架构师介绍-软件架构设计学习第一天(非原创)
文章大纲 一.架构师定义二.架构师分类与具备能力三.研发人员发展的技术路线四.架构师知识体系五.参考文章 一.架构师定义 什么是架构师,这个聊架构话题时永恒的问题.每个公司对架构师的定位也有所 ...
- python常见的加密方式
1.前言 我们所说的加密方式都是对二进制编码的格式进行加密,对应到python中,则是我妈们的bytes. 所以当我们在Python中进行加密操作的时候,要确保我们的操作是bytes,否则就会报错. ...