python网络编程(初识)


一些概念

套接字:

套接字(socket)也叫通信端点,最初用于计算机内部进程之间的通信,而随着网络的发展,套接字被用于计算机之间的通信。举个例子,你(是一台计算机)要打电话给你的朋友(另一台计算机),你只有朋友的电话号码可不行,还得有台电话,而这台电话就相当于一个套接字。

套接字有两种一种基于文件,一种基于网络。基于文件可以简单理解为用于进程通信的,基于网络的可以简单理解为用于计算机之间的通信的。而他们又被分为了不同的地址家族(address family,抽象的名字),如AF_UNIX,AF_INET... 既然是python网络编程,先把重点放在AF_INET(使用ipv4)上。

额...还有一个概念,有连接和无连接套接字。有连接使用TCP ,套接字类型为SOCK_STREAM,无连接使用UDP,套接字类型为SOCK_DGRAM。


socket 实现简单的C/S

现在的开发一般都用的时socketserver,但我是一个初学者所以决定从socket编写一些简单的脚本开始学习。

先用socket来模拟一下C/S建构的基本通信。首先是服务器端,当然这分为TCP和UDP服务器,先来TCP的练习。作为一个TCP服务器,首先要等一个来自客户端的连接。然后和客户端建立连接,最后才是和客户端进行通讯。socket有很多属性,这里列出几种常用的属性,这也是我们需要的属性。

socket(family,type,proto) family 是地址家族,我们使用AF_INET,当然这也是默认值,type我们使用SOCK_STREAM,这也是默认值,最后一个proto参数暂时用不到,先不考虑。

bind(address) 该方法用来绑定服务端的ipport但是只接受一个参数,所以需要把ipport打包为一个元组传入即可。

listen()该方法启动服务器开始监听

accept()该方法等待一个客户端的连接请求,如果有客户端请求连接,那么该方法就会生成一个连接对象,并且将该对象和客户端的ip作为返回值返回。当连接对象被创建,服务端和客户端就可以开始交互了。当然当accept()创建了一个对象后,会重新回到原始的状态去等待新的连接,新的连接到来时又会重复上述过程。

recv(buffer)该方法用于接收数据buffer为接收数据的大小。当然数据的类型为bytes

send(bytes) 发送数据,发送的也是bytes

先例举这么多,下面开始第一个程序,生活需要仪式感,起一个 NB 的名字 Binary_TCPserver_V1

# Binary_TCPserver_V1
import socket
from time import ctime
server = socket.socket()
server.bind(("localhost",6969))
server.listen() # starting listen
print('waiting connection...')
conn,addr = server.accept() # wait the connect in ...
# and return a connection representing and a ip address
data = conn.recv(1024)
print("Server recive data:",data)
conn.send(b'[%s] %s'% (data,ctime().encode('utf-8')))
# send a bytes type not a str
server.close()

我们接收来自客户端的一组数据,然后返回该数据加当前的时间,显然这不是一个合格的服务端程序,它接受完一次连接请求进行一次和客户端的交互后就退出了,服务端是不应该退出的。但是为了试一下该程序的逻辑是否正确,写一个简单的客户端和它交互一下。

# Binary_TCPclinet_V1
import socket
clinet = socket.socket()
clinet.connect(('localhost',6969))
send_data = input('>>:') # type is string
clinet.send(send_data.encode('utf-8')) # change type to bytes
data = clinet.recv(1024) # buffersize 1024 Byte
print("Clinet recive data:",data.decode())
clinet.close()

先运行服务端,然后运行客户端,客户端返回

>>:i am binary
Clinet recive data: [i am binary] Mon Dec 9 17:06:41 2019

服务端返回

waiting connection...
Server recive data: b'i am binary'

看到我们已经实现了简单的交互,但是,不能客户端说了一句话服务端返回然后就结束了这次谈话吧。我们要让服务器一直运行下去,客户端说够了再退出而不是说一句就连接断开了。上Binary_TCPserver_V2

while True:
print('waiting connection...')
conn,addr = server.accept() # wait the connect in ...
# and return a connection representing and a ip address
while True:
data = conn.recv(1024)
if not data:
print('clinet has broken the connection...')
break
print("Server recive data:",data)
conn.send(b'[%s] %s'% (data,ctime().encode('utf-8'))) # send a bytes type not a str
server.close()

其实就是加了两个循环而已,客户端代码,一次交互个够的那种。

# Binary_TCPclinet_V1
import socket
clinet = socket.socket()
clinet.connect(('localhost',6969))
while True:
send_data = input('>>:') # type is string
if not send_data:
break
clinet.send(send_data.encode('utf-8')) # change type to bytes
data = clinet.recv(1024) # buffersize 1024 Byte
print("Clinet recive data:",data.decode())
clinet.close()

测试,客户端

>>:i am binary
Clinet recive data: [i am binary] Mon Dec 9 18:15:50 2019
>>:i am handsome
Clinet recive data: [i am handsome] Mon Dec 9 18:15:58 2019
>>:

服务器端

waiting connection...
Server recive data: b'i am binary'
Server recive data: b'i am handsome'
clinet has broken the connection...
waiting connection...

看到我们已经基本实现了一个单线程服务器了,这当然不是最终目的。有了这个基础,不必太过纠结还有很多的关于socket不会的内容。我们开始进军socketserver这才是最终的目的。

python ---socket初识的更多相关文章

  1. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  2. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  3. python socket发送魔法包网络唤醒开机.py

    python socket发送魔法包网络唤醒开机.py 现在的电脑应该都普遍支持有线网络的WOL了,支持无线网络唤醒的电脑,可能比较少. """ python socke ...

  4. Python socket编程之二:【struct.pack】&【struct.unpack】

    import struct """通过 socket 的 send 和 recv 只能传输 str 格式的数据""" "" ...

  5. Python Socket,How to Create Socket Server? - 网络编程实例

    文章出自:Python socket – network programming tutorial by Silver Moon 原创译文,如有版权问题请联系删除. Network programin ...

  6. Python Socket,How to Create Socket Cilent? - 网络编程实例

    文章出自:Python socket – network programming tutorial by Silver Moon 原创译文,如有版权问题请联系删除. Network programin ...

  7. Python Socket通信原理

    [Python之旅]第五篇(一):Python Socket通信原理   python Socket 通信理论 socket例子 摘要:  只要和网络服务涉及的,就离不开Socket以及Socket编 ...

  8. Python Socket单线程+阻塞模式

    Python之旅]第五篇(二):Python Socket单线程+阻塞模式 python Socket单线程 Socket阻塞模式 串行发送 摘要:  前面第五篇(一)中的一个Socket例子其实就是 ...

  9. python socket之tcp服务器与客户端demo

    python socket之tcp服务器与客户端demo 作者:vpoet mails:vpoet_sir@163.com server: # -*- coding: cp936 -*- ''' 建立 ...

随机推荐

  1. 通过日志解决问题的一个小例子-http换端口

    这个例子是将http服务的监听端口改为8999后重启服务报错: 此时查看日志/var/log/message,显示如下: 如红笔所示轨迹得到设置端口类型的命令:semanage port -a -t ...

  2. 从Hello World 来讲解线程

    从一个经典的例子开始:一个打印“Hello World.”的程序.一个非常简单的在单线程中运行的Hello World程序如下所示,当我们谈到多线程时,它可以作为一个基准. #include<i ...

  3. P1501 [国家集训队]Tree II LCT

    链接 luogu 思路 简单题 代码 #include <bits/stdc++.h> #define ls c[x][0] #define rs c[x][1] using namesp ...

  4. UDF——Fluent与Matlab数据耦合

    本文编译工具:VC++ UDF Studio 该插件可以直接在Visual Studio中一键编译.加载.调试UDF源码,极大提高编写排错效率,且支持C++,MFC,Windows API和第三方库, ...

  5. IntelliJ IDEA 快捷键终极大全,速度收藏!

    ​阅读本文大概需要 6 分钟. ▌自动代码 常用的有 fori/sout/psvm+Tab 即可生成循环.System.out.main 方法等 boilerplate 样板代码 . 例如要输入 fo ...

  6. 更改THttpClientSocket连接超时时间

    更改THttpClientSocket连接超时时间 THttpClientSocket连接超时时间默认是30秒,如果要设大点,可用下面的代码: procedure TForm1.FormCreate( ...

  7. Spring Cloud-新一代Web框架微服务

    序言 springcloud是微服务架构的集大成者,将一系列优秀的组件进行了整合.基于springboot构建,对我们熟悉spring的程序员来说,上手比较容易. 通过一些简单的注解,我们就可以快速的 ...

  8. jdk 6-13最有价值新特性总结

    355: Text Blocks (Preview) JDK 13的特性.简化了大段文本的换行,例如sql或xml段. Shenandoah GC. jdk 12作为实验特性引入. JEP330-启动 ...

  9. Go1.13 标准库的 http 包爆出重大 bug,你的项目中招了吗? 原创: 王亚楼 Go语言中文网 今天

    Go1.13 标准库的 http 包爆出重大 bug,你的项目中招了吗? 原创: 王亚楼 Go语言中文网 今天

  10. scrapy爬虫案例:用MongoDB保存数据

    用Pymongo保存数据 爬取豆瓣电影top250movie.douban.com/top250的电影数据,并保存在MongoDB中. items.py class DoubanspiderItem( ...