目录

  socket  

  简单的聊天机器人

  简单的ftp上传

  粘包问题的解决

一. socket模块

  socket,俗称套接字,其实就是一个ip地址和端口的组合。类似于这样的形式(ip,  port),其中ip代表的是某个主机,port代表的是某个应用,我们可以通过socket和另外的一台主机进行通信。

  关于socket源码的解析在tarnado系列文章中,正在写中。。。。。

  1. 通信的方式

    tcp通信

    udp通信

    基于unix的通信

  2. socket的方法 

# 暂时知道的也就这么多,之后要是在用到其他的我会继续进行保存
Methods of socket objects (keyword arguments not allowed): _accept() -- accept connection, returning new socket fd and client address
bind(addr) -- bind the socket to a local address 给本地地址绑定一个socket套接字
close() -- close the socket 关闭一个套接字
connect(addr) -- connect the socket to a remote address 连接到远端主机
connect_ex(addr) -- connect, return an error code instead of an exception
dup() -- return a new socket fd duplicated from fileno()
fileno() -- return underlying file descriptor
getpeername() -- return remote address [*]
getsockname() -- return local address
getsockopt(level, optname[, buflen]) -- get socket options
gettimeout() -- return timeout or None
listen([n]) -- start listening for incoming connections
recv(buflen[, flags]) -- receive data 接受数据
recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer) 接受数据到缓冲区中,
recvfrom(buflen[, flags]) -- receive data and sender's address
recvfrom_into(buffer[, nbytes, [, flags])
-- receive data and sender's address (into a buffer)
sendall(data[, flags]) -- send all data 发送数据给远端主机,3.x之后只能发送字节形式,因此在发送的时候一般要进行转换bytes
send(data[, flags]) -- send data, may not send all of it 也是发送数据,区别在于send发送的不完整,随机进行发送的,二sendall发送的完整
sendto(data[, flags], addr) -- send data to a given address 基于udp发送数据的
setblocking(0 | 1) -- set or clear the blocking I/O flag 是否设置成阻塞模式0 代表阻塞,1代表非阻塞
setsockopt(level, optname, value) -- set socket options 设置一些socket的桉树
settimeout(None | float) -- set or clear the timeout 设置超时市场
shutdown(how) -- shut down traffic in one or both directions
if_nameindex() -- return all network interface indices and names
if_nametoindex(name) -- return the corresponding interface index
if_indextoname(index) -- return the corresponding interface name [*] not available on all platforms!

二. 简单的聊天机器人

  如果发送一个数据,服务器就会给他回复一个数据 + 你好

 # -*- coding:utf-8 -*-
# zhou
# 2017/7/3 import socket
# 创建一个server对象
server_obj = socket.socket()
# 绑定一下端口
server_obj.bind(("127.0.0.1", 8888, ))
# 设置监听的等待队列长度为5,当大于5的时候就拒绝连接
server_obj.listen(5) while True:
# 等待接受客户端的连接,为阻塞方式
conn, address = server_obj.accept()
# 发送欢迎信息
conn.sendall(bytes("欢迎来到简单的聊天室..", encoding='utf-8'))
while True:
# 接受到对面的消息就会把对面消息后面加上你好重新发送回去
ret = str(conn.recv(1024), encoding='utf-8')
if ret == 'q':
# 如果对面发送的为q就退出
break
conn.sendall(bytes(ret + ",你好", encoding='utf-8'))

server

# -*- coding:utf-8 -*-
# zhou
# 2017/7/3 import socket client = socket.socket()
client.connect(("127.0.0.1", 8888, ))
# 接受欢迎信息并打印
ret = str(client.recv(1024), encoding='utf-8')
print(ret) while True:
message = input("请输入您要发送的内容:")
client.sendall(bytes(message, encoding='utf-8'))
if message == 'q':
break
ret = str(client.recv(1024), encoding='utf-8')
print(ret)

client

三. 简单的ftp上传

  实现了将一个图片上传到服务器端

 # -*- coding:utf-8 -*-
# zhou
# 2017/7/2 import socket server = socket.socket()
server.bind(("127.0.0.1", 9998, )) # 绑定ip
server.listen(5) while True:
conn, address = server.accept()
# 连接之后首先接收文件大小
file_size = int(str(conn.recv(1024), encoding='utf-8'))
# 用来解决粘包问题的
conn.sendall(bytes("", encoding='utf-8'))
# 已经接受的文件大小
has_size = 0
num = 1
# 连接之后接收文件
f = open("new.jpg", 'wb')
while True:
num += 1
if file_size == has_size:
break
data = conn.recv(1024)
f.write(data)
has_size += len(data)
f.close() # 关闭文件

ftpserver

 # -*- coding:utf-8 -*-
# zhou
# 2017/7/2 import os
import socket client = socket.socket() client.connect(("127.0.0.1", 9998), )
# 传送文件大小
file_size = os.stat("1.jpg").st_size
print(file_size)
# 发送文件大小
client.sendall(bytes(str(file_size), encoding='utf-8'))
client.recv(1024) # 解决粘包问题
# 发送文件
with open("1.jpg", 'rb') as f:
for line in f:
client.sendall(line)
client.close()

ftpclient

四. 粘包问题的解决

  对于上面第三个ftp上传进行的描述,

  解决粘包的问题,当我们上传一个文件的时候,首先上传他的大小,当我们上传完大小之后要在写一句接受的语句,而服务器端在接受到文件大小之后要给我们立马发送一个数据用来确认,这样我们就可以完美的将数据喝大小分割开了。

  

Python系列8之socket的更多相关文章

  1. Python(七)Socket编程、IO多路复用、SocketServer

    本章内容: Socket IO多路复用(select) SocketServer 模块(ThreadingTCPServer源码剖析) Socket socket通常也称作"套接字" ...

  2. Python全栈【Socket网络编程】

    Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...

  3. Python学习之路--Socket

    Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...

  4. 总结整理 -- python系列

    python系列 python--基础学习(一)开发环境搭建,体验HelloWorld python--基础学习(二)判断 .循环.定义函数.继承.调用 python--基础学习(三)字符串单引号.双 ...

  5. Winsock系列函数 及 Socket通信流程

    Socket是一种网络通信机制   Winsock系列函数   1. Socket 创建socket   2. Connect 尝试连接远端Socket   3. Send 在某个Socket 向远端 ...

  6. 初探接口测试框架--python系列7

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

  7. 初探接口测试框架--python系列2

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

  8. 初探接口测试框架--python系列3

    点击标题下「微信」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是我们期 ...

  9. 初探接口测试框架--python系列4

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

随机推荐

  1. 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色

    简介 在简单恢复模式下,日志文件的作用仅仅是保证了SQL Server事务的ACID属性.并不承担具体的恢复数据的角色.正如”简单”这个词的字面意思一样,数据的备份和恢复仅仅是依赖于手动备份和恢复.在 ...

  2. 接口测试get请求url拼接函数(python)

    get请求地址一般是 协议+域名+端口+路径+参数,除了协议和域名其他均可为空.  http(s)://domain:port/path?key1=value1&key2=value2& ...

  3. 第一次在stack overflow回答问题

    越发感觉英语的重要性,尝试阅读英文与写作英文.于是选择了stack overflow来进行实践.作为萌新小白,只学习过C语言,就在c标签下乱逛.尝试看懂一些问题且试着回答. 发现一个问题: I nee ...

  4. Vim中 ctags 跳转直接跳到第一个匹配行的问题

    意图 用ctags搜索代码时, 用 ctrl + ] 后,只有一个匹配项直接跳转,有多个则列出所有匹配项选择跳转 问题 在 vim 中使用 ctags 是一个很令人舒服的事情,但有时一些默认的配置和不 ...

  5. LG3690 【【模板】Link Cut Tree (动态树)】

    题目 终于去写\(LCT\)了 这个大爷讲的挺好的 板子 #include<algorithm> #include<iostream> #include<cstring& ...

  6. PHP设计模式——装饰器模式

    <?php /** * 装饰器模式 * 如果已有对象的部分内容或功能发生变化,但是不需要修改原始对象的结构,应使用装饰器模式 * * 为了在不修改对象结构的前提下对现有对象的内容或功能稍加修改, ...

  7. 教你用SingalR实现后台开发程序运行时时检测

    在调试js的时候都喜欢用console.log输出相应的运行结果或者查看变量值,以便于调试程序bug,可是程序后台代码运行的时候,本地没有问题,线上代码有问题怎么办呢,写日志是一个办法,可是有没有更直 ...

  8. 梯度下降(HGL)

    线性回归:是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法. 对于一般训练集:                参数系统为:      线性模型为:      损 ...

  9. 1..net转java背景介绍

    注册博客2年了.从注册就开始接触.net.以前也有想过转java.只是没想过会这么快. .net语法这么优美好用.可惜了生态环境. .net还没有学成大神.就要离开了. 公司有个项目要用java.在加 ...

  10. 微软.net framework 源码学习

    1. 直接下载.NET Framework源代码(下载地址),然后用Visual Studio打开查看. 2. 在线查看,网址:http://referencesource.microsoft.com ...