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. MySQL8.0忘记密码后重置密码(亲测有效)

    实测,在mysql8系统下,用mysqld --console --skip-grant-tables --shared-memory可以无密码启动服务 服务启动后,以空密码登入系统 mysql.ex ...

  2. LINK : fatal error LNK1181: cannot open input file 'glew32.lib' error: command 'C:\\Program Files (

    下载 库文件 参考: https://stackoverflow.com/questions/53355474/kivent-installation-fatal-error-lnk1181-cant ...

  3. exception java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

      1.情景展示 Java 报错信息如下: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 2.原因分析 首先,这是越界异常,但不是数组越 ...

  4. 【Beta】Scrum meeting 8 & 助教参会记录

    目录 写在前面 进度情况 任务进度表 Beta-1阶段燃尽图 遇到的困难 助教参会会议情况 会议具体内容 Q:最近压力大吗?临近期末,注意好时间安排 Q:最近进度如何,以后的计划如何 Q:这段时间遇到 ...

  5. [Beta]Scrum Meeting#1

    github 本次会议项目由PM召开,时间为5月6日晚上10点30分 时长15分钟 任务表格 人员 昨日工作 下一步工作 木鬼 beta初步计划 撰写博客整理文档 swoip 前端改进计划 模块松耦合 ...

  6. 变异的功能 | variants function | coding | non-coding

    variant主要分为两类: coding noncoding 这两大类的分析方法截然不同,coding主要直接影响了mRNA和蛋白:而noncoding,主要是影响调控. coding编码区如何分析 ...

  7. Windows Server 2012 R2 卸载IE浏览器

    If you run any Windows Servers, you may run into a scenario where you want to remove access to Inter ...

  8. centos 7 U盘 uefi 模式装机

    公司买了一台新的dell机器,因为装的是window ,所以想给改成Centos 的做服务器,但是问题来了,一上来装好,就完全进入不了引导系统,换了ubuntu 有一次意外装上了,但一直是什么原因,然 ...

  9. 《Go语言实战》读书笔记

    <Go语言实战>中文版pdf 百度网盘: https://pan.baidu.com/s/1kr-gMzaPAn8BFZG0P24Oiw 提取码: r6rt 书籍源码:https://gi ...

  10. Error-ASP.NET:未能加载文件或程序集“CMSCalendar”或它的某一个依赖项。系统找不到指定的文件。

    ylbtech-Error-ASP.NET:未能加载文件或程序集“CMSCalendar”或它的某一个依赖项.系统找不到指定的文件. 1.返回顶部 1. “/”应用程序中的服务器错误. 分析器错误 说 ...