参考blog :www.cnblogs.com/yuanchenqi/articles/5692716.html

1. sk = socket.socket()

里面有两个重要的参数,family 和 type

type:

SOCK_STREAM : tcp 默认

SOCK_DGRAM :udp

family:

family = AF_INET : 服务器之间的通信(默认)

family = AF_INET6 : 服务器之间的通信

family=AF_UNIX:unix不同进程间通信

server 下的方法:

bind()  、 listen()  、 accept()

recv()  、 send()  、 sendall()

close()

client 下的方法:

connect()

recv() 、send( string ) 、sendall()  # 传送的类型一定是 byte 类型

close()

# _author: lily
# _date: 2019/1/25 # server 端 import socket sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.bind(address)
sk.listen(3)
print('waiting')
# print(sk)
conn, address_client = sk.accept() while 1:
send_data = input('input>>')
if send_data == 'exit':
break
conn.send(bytes(send_data, 'utf8'))
rec_data = conn.recv(1024)
print(str(rec_data, 'utf8')) conn.close()
# _author: lily
# _date: 2019/1/25 # client 端 import socket
sk = socket.socket()
# print(sk) adress = ('127.0.0.1', 8000)
sk.connect(adress) while 1:
rec_data = sk.recv(1024) # 会阻塞,直到收到数据
if not rec_data:
break
print(str(rec_data, 'utf8'))
send_data = input('>>')
sk.send(bytes(send_data, 'utf8')) sk.close()

socket 流程:

1. 先开启服务端,bind 绑定ip 和端口;

2. 其次 listen 监听,里面的数字表示有多少客户端可排队(不包括当前正在通信的,排队表示可连接但是不能通信。比如设定上限为3,当第四个客户端来连接时就会报错无法连接)

3. 接着需要 accept(),阻塞等待连接。accept 接受到的值是对方的 sk,进行连接(相当于两端建立了一个通道,server 和 client 都使用的这个通道,只是各自的命名不同)。

4. 保证一收一发原则

5. 关闭时关闭这个通道。 conn.close()

1. 客户端进行连接,先创建一个socket 对象 sk

2. sk 使用 connect 连接服务端

3. 保证一收一发原则

4. 关闭时 sk.close()

粘包现象的解决办法:

加一个 conn.recv(1024) 进行阻塞,将两个连续的conn.send()分隔开

编码拾遗:

  • str:unicode
  • bytes:十六进制
  • 由 str -> bytes:编码

s = ‘hello 你好’

b = bytes(s, ‘utf8’)

b2 = s.encode(‘utf8’)    #  两个是一样的

  • 由 bytes -> str:解码

s2 = str(b2, ‘utf8’)

s2 = b2.decode(‘utf8’)

socketserver:

1. 调用模块

2. 自己写一个类,继承 socketserver.BaseRequestHandler,并重写 handle()方法

3. main 方法内:

调用 socketserver.ThreadingTCPServer,创建一个实例

# _author: lily
# _date: 2019/1/28
# Server 端 import socketserver class myserver(socketserver.BaseRequestHandler):
# 主要逻辑
def handle(self):
print('server starting...')
while True:
conn = self.request
print(self.client_address)
while True:
client_data = conn.recv(1024)
print(str(client_data, 'utf8'))
print('waiting')
send_data = input('input>>')
conn.sendall(bytes(send_data, 'utf8'))
# conn.sendall(client_data)
conn.close() if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1', 8091), myserver)
server.serve_forever()
# _author: lily
# _date: 2019/1/28
# client 端 import socket address = ('127.0.0.1', 8091)
sk = socket.socket()
sk.connect(address)
print('client starting...') while True:
data = input('input>>')
sk.sendall(bytes(data, 'utf8'))
recv_data = sk.recv(1024)
print(str(recv_data, 'utf8')) sk.close()

实例:

cmd 命令:

server 端:

# _author: lily
# _date: 2019/1/26 import socket
import subprocess sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.bind(address)
sk.listen(3)
print('waiting')
# print(sk)
conn, address_client = sk.accept() while 1: try:
rec_data = conn.recv(1024)
except Exception:
break
if not rec_data:
break
print('--client message--', str(rec_data, 'utf8')) a = subprocess.Popen(str(rec_data, 'utf8'), shell=True, stdout=subprocess.PIPE)
cmd_result = a.stdout.read()
result_len = bytes(str(len(cmd_result)), 'utf8')
conn.sendall(result_len)
conn.recv(1024)
conn.sendall(cmd_result) # send_data = input('input>>')
# conn.send(bytes(send_data, 'utf8')) conn.close()

client 端:

# _author: lily
# _date: 2019/1/26 import socket
sk = socket.socket()
# print(sk) adress = ('127.0.0.1', 8000)
sk.connect(adress) while 1: send_data = input('>>')
if send_data == 'exit':
break
sk.send(bytes(send_data, 'utf8')) result_len = int(str(sk.recv(1024), 'utf8'))
print(result_len)
rec_data = bytes()
sk.sendall(bytes('ok', 'utf8'))
while len(rec_data) != result_len:
rec_data += sk.recv(1024) # 会阻塞,直到收到数据
print(str(rec_data, 'gbk')) sk.close()

ftp 传输:

server 端:

# _author: lily
# _date: 2019/1/27 import socket
import subprocess
import os sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.bind(address)
sk.listen(3)
print('waiting')
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) while 1:
conn, address_client = sk.accept()
while 1:
data = conn.recv(1024)
cmd, filename, filesize = str(data, 'utf8').split('|')
path = os.path.join(BASE_DIR, 'picture', filename)
filesize = int(filesize) f = open(path, 'ab') has_receive = 0
while has_receive != filesize:
data = conn.recv(1024)
f.write(data)
has_receive += len(data)
f.close() conn.close()

client 端:

# _author: lily
# _date: 2019/1/27 import socket
import os
sk = socket.socket()
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) adress = ('127.0.0.1', 8000)
sk.connect(adress) while 1: send_data = input('>>').strip() # post|11.png
cmd, path = send_data.split('|')
path = os.path.join(BASE_DIR, path) filename = os.path.basename(path)
file_size = os.stat(path).st_size file_info = 'post|%s|%s' % (filename, file_size)
sk.sendall(bytes(file_info, 'utf8')) f = open(filename, 'rb')
has_sent = 0
while has_sent != file_size:
data = f.read(1024)
sk.sendall(data)
has_sent += len(data)
f.close()
print('success') sk.close()

server 下的方法:

bind()

listen()

accept()

recv()

send( string )

sendall()

close()

client 下的方法:

connect()

recv()

send( string )

sendall()  # 传送的类型一定是 byte 类型

close()

25 python 初学(socket,socketserver)的更多相关文章

  1. 转:Python 的 Socket 编程教程

    这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...

  2. Python 之socket的应用

    本节主要讲解socket编程的有关知识点,顺便也会讲解一些其它的关联性知识: 一.概述(socket.socketserver): python对于socket编程,提供了两个模块,分别是socket ...

  3. python3之socket&socketserver网络编程

    1.套接字与套接模块 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并进行连接,如发送和接受数据.为了 ...

  4. Python基础socket编程

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...

  5. python实现socket上传下载文件-进度条显示

    在python的socket编程中,可以实现上传下载文件,并且在下载的时候,显示进度条,具体的流程如下图所示: 1. 服务器端代码如下: [root@python 519]# cat server.p ...

  6. 「Python」socket指南

    开始 网络中的 Socket 和 Socket API 是用来跨网络的消息传送的,它提供了 进程间通信(IPC) 的一种形式.网络可以是逻辑的.本地的电脑网络,或者是可以物理连接到外网的网络,并且可以 ...

  7. python操作socket

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...

  8. Python 006- python socket编程详细介绍

    转自https://blog.csdn.net/rebelqsp/article/details/22109925 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供 ...

  9. Python:socket实现ftp程序

    刚开始学习socket编程,还不是特熟练,码了好长时间,中间遇到许多问题,记录一下用socketserver写ftp server端: #!/usr/bin/env python import soc ...

随机推荐

  1. 浅析Javascript单例模式

    定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点 .就想我们在开发中有些对象只需要一个,例如window对象. 1. 实现单例模式 var Singleton = function( nam ...

  2. 自己构建一个Spring自定义标签以及原理讲解

    平时不论是在Spring配置文件中引入其他中间件(比如dubbo),还是使用切面时,都会用到自定义标签.那么配置文件中的自定义标签是如何发挥作用的,或者说程序是如何通过你添加的自定义标签实现相应的功能 ...

  3. springboot+mybatis+dubbo+aop日志终结篇

    之前的几篇文章把dubbo服务层都介绍完毕,本篇文章咱们主要写web层如何调用服务层的方法.文章底部附带源码. 启动服务 服务启动时,会向zk注册自己提供的服务,zk则会记录服务提供者的IP地址以及暴 ...

  4. ldap配置系列一:ldap的安装

    ldap的安装 ldap的简介 LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP.它是基于X.500标准的,但是简 ...

  5. Linux基础知识第四讲,文件内容命令

    目录 一丶常用命令 1.cat命令演示以及常用选项 2.grep 搜索命令的使用 3.echo 以及 重定向的使用 4.管道概念 一丶常用命令 序号 命令 对应英文 作用 01 cat 文件名 con ...

  6. sysbench的框架实现介绍

    sysbench是一个非常经典的综合性能测试工具,它支持CPU,IO,内存,尤其是数据库的性能测试.那它是怎么做到通用性的呢,总结一句话是大量运用了重载的方法. sysbench总体架构 sysben ...

  7. 【测试工程师面试】 记录XX银行面试

    LZ在一个18线小城市做测试,近来想走出自己的舒适区,去做一点不一样的测试工作. 18线地区,测试工作并不多.最好的差不多就是LZ目前待着的公司了.遂决定去魔都闯荡几年,对一个在魔都无房无车无户口的人 ...

  8. Python面向对象:杂七杂八的知识点

    为什么有这篇"杂项"文章 实在是因为python中对象方面的内容太多.太乱.太杂,在写相关文章时比我所学过的几种语言都更让人"糟心",很多内容似独立内容.又似相 ...

  9. .Net Core 编码规范

    .Net Core 编码规范 标签: 未分类 概述 规范制定原则 方便代码的交流和维护. 不影响编码的效率,不与大众习惯冲突. 使代码更美观.阅读更方便. 使代码的逻辑更清晰.更易于理解. 术语定义 ...

  10. sql server 2008R2 导出insert 语句(转载)

    转载来源: https://blog.csdn.net/zengcong2013/article/details/78648988. sql server 2008R2数据库导出表里所有数据成inse ...