原文链接:http://www.limerence2017.com/2018/01/02/python20/

python 网络编程和基本的C语言编程一样,效率不是很高,如果为了封装通信库
建议采用C/C++做底层封装,采用epoll、poll、iocp等网络模型封装,编译成网络库
供其他模块使用。这里在python学习过程中介绍一下

TCP 编程 服务器端

创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
AF_INET表示网络通信,SOCK_STRAM表示面向字节流TCP方式通信。
绑定端口和地址
s.bind((‘127.0.0.1’,9999))
监听套接字
s.listen(5)
5,表示监听队列最大多长。
接收客户端连接
sock, addr = s.accept()
s为生成的socket,accept接收客户端连接,返回对端描述符和地址
接收数据
data = sock.recv(1024)
sock为对端socket,recv接收数据,最多接收1024
发送数据
sock.send((‘Hello, %s’ %data.decode(‘utf-8’)).encode(‘utf-8’))
关闭描述符
sock.close()

TCP客户端编程

创建一个socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
建立连接
s.connect((‘127.0.0.1’, 9999))
接收消息和发送消息
s.send(data)
s.recv(1024).decode(‘utf-8’)
关闭描述符
s.close()

服务端案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import socket
import threading
import time #线程处理函数
def tcplink(sock, addr):
print('Accept new connection from %s:%s...' % addr)
sock.send(b'Welcome!')
while True:
data = sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8')=='exit':
break
sock.send(('Hello, %s' %data.decode('utf-8')).encode('utf-8'))
sock.close()
print('Connection from %s:%s closed.'%addr) #服务器tcp编程流程
#创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#绑定套接字
s.bind(('127.0.0.1',9999))
#监听套接字
s.listen(5) print('Waiting for connection...')
# 调用accept接受连接
while True:
# 接收新的连接
sock, addr = s.accept()
# 创建新的线程处理TCP
t = threading.Thread(target=tcplink,args=(sock,addr))
t.start()

客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import socket

#创建一个socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('127.0.0.1', 9999))
# 接收欢迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Sarah']:
# 发送数据:
s.send(data)
print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()

UDP通信

udp通信和tcp通信不一样,很简单。服务器端不需要监听和accept,
客户端也不需要connect。
服务端 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口:
s.bind(('127.0.0.1', 9999)) print('Bind UDP on 9999...')
while True:
# 接收数据:
data, addr = s.recvfrom(1024)
print('Received from %s:%s.' % addr)
s.sendto(b'Hello, %s!' % data, addr)

服务器端绑定好端口和地址后,调用recvfrom返回数据和对端地址
客户端 示例:

1
2
3
4
5
6
7
8
9
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [b'Michael', b'Tracy', b'Sarah']:
# 发送数据:
s.sendto(data, ('127.0.0.1', 9999))
# 接收数据:
print(s.recv(1024).decode('utf-8'))
s.close()

客户端发送数据和接收数据和之前一样,仅仅是不需要调用connect连接服务器了。

谢谢关注我的公众号:

python学习(20) 网络编程的更多相关文章

  1. python学习之网络编程基础

    引入场景:客户与银行关系 银行职员负责给客户提供取钱服务,客户通过账户密码跟银行职员建立合作关系.此时银行职员就可以作为服务器,当用户A取完钱后他需要等待下一个用户的接入,用户的账号密码就是建立合作关 ...

  2. python学习(九) 网络编程学习--简易网站服务器

    python `网络编程`和其他语言都是一样的,服务器这块步骤为:`1. 创建套接字``2. 绑定地址``3. 监听该描述符的所有请求``4. 有新的请求到了调用accept处理请求` Python ...

  3. Python学习之==>网络编程

    一.什么是网络编程 使用Python进行网络编程,就是通过Python打开一个网站,或者请求一个http接口.可以通过标准模块urllib实现,也可以通过更简单易用的第三方模块requests实现. ...

  4. python学习总结---网络编程

    网络编程 相关概念 - OSI七层模型:它从低到高分别是:物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. - TCP/IP: 在OSI七层模型基础上简化抽象出来的一套网络协议簇,现在得到 ...

  5. Python学习--19 网络编程

    TCP编程 Client 创建一个基于TCP连接的Socket: # coding: utf-8 import socket # 创建一个TCP连接: s = socket.socket(socket ...

  6. Python学习day36-并发编程(2)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  7. 第六篇:python高级之网络编程

    python高级之网络编程   python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及 ...

  8. Python学习day40-并发编程(终)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  9. Python学习day39-并发编程(各种锁)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

随机推荐

  1. 将项目托管到GitHub实现步骤

    修改于:2017.1.14 第一步:先注册一个Github的账号 注册地址:Github官网注册入口 第二步:准备工作 gitHub网站使用Git版本管理工具来对仓库进行管理,但是它们并不等同. gi ...

  2. 最小费用最大流模板(POJ 2135-Farm Tour)

    最近正好需要用到最小费用最大流,所以网上就找了这方面的代码,动手写了写,先在博客里存一下~ 代码的题目是POJ2135-Farm Tour 需要了解算法思想的,可以参考下面一篇文章,个人觉得有最大流基 ...

  3. Beta发布文案+美工

    团队名称:探路者 1蔺依铭:http://www.cnblogs.com/linym762/(组长) 2张恩聚:http://www.cnblogs.com/zej87/ 3米赫:http://www ...

  4. 关于 error C2001: 常量中有换行符

    看过之后,还是有所收获的,先mark一下 原链接: http://www.cnblogs.com/cocos2d-x/archive/2012/02/26/2368873.html#commentfo ...

  5. SqlServer中的dbo是什么意思

    出处:http://andylin02.iteye.com/blog/486296 SqlServer中的dbo是什么意思? DBO是每个数据库的默认用户,具有所有者权限,即DbOwner 通过用DB ...

  6. TCP系列52—拥塞控制—15、前向重传与RACK重传拥塞控制处理对比

    一.概述 这里主要简单分析一个丢包重传并恢复的场景,通过不同的设置让这个相同的场景分别触发RACK重传和前向重传,通过对比说明以下问题: Forward Retransmit可以产生只有重传标记的数据 ...

  7. Delphi判断字符串中是否包含汉字,并返回汉字位置

    //1,函数代码{判断字符串是否包含汉字// judgeStr:要判断的字符串//posInt:第一个汉字位置}function TForm2.IsHaveChinese(judgeStr: stri ...

  8. 关于Jquery使用中遇到典型问题集锦

    ①$.post("url",{search:1},function(){},"json")请求数据成功就是不执行回调函数? 答:最大可能导致原因为 数据格式不正 ...

  9. 解决vsftp无法上传文件及文件夹的问题

    因为搞hadoop的缘故,考虑到启动linux桌面会给电脑带来比较卡..所以就将图形界面的启动给关闭,完全在命令的模式下使用linux. 使用yum搭建了ftp服务..yum的使用参考:http:// ...

  10. vue 组件 组件2

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>T ...