python socket编程_Python学习记录-socket编程

1. OSI七层模型详解

wKiom1krjIqzDBrbAAcxal-nSDw254.png

2. Python socket

什么是 Socket?

Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

Python 提供了两个级别访问的网络服务:

低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法。

高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。

3. socket()函数

Python 中,我们用 socket()函数来创建套接字,语法格式如下: socket.socket([family[, type[, proto]]])

参数

family: 套接字家族可以使AF_UNIX或者AF_INET

type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM

protocol: 一般不填默认为0.

Socket 对象(内建)方法

函数

描述

服务器端套接字

s.bind()

绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址。

s.listen()

开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。

s.accept()

被动接受TCP客户端连接,(阻塞式)等待连接的到来

客户端套接字

s.connect()

主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。

s.connect_ex()

connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

公共用途的套接字函数

s.recv()

接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。

s.send()

发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。

s.sendall()

完整发送TCP数据,完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。

s.recvform()

接收UDP数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。

s.sendto()

发送UDP数据,将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。

s.close()

关闭套接字

s.getpeername()

返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。

s.getsockname()

返回套接字自己的地址。通常是一个元组(ipaddr,port)

s.setsockopt(level,optname,value)

设置给定套接字选项的值。

s.getsockopt(level,optname[.buflen])

返回套接字选项的值。

s.settimeout(timeout)

设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect())

s.gettimeout()

返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None。

s.fileno()

返回套接字的文件描述符。

s.setblocking(flag)

如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。

s.makefile()

创建一个与该套接字相关连的文件

4. TCP socket通信流程

Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。

以下是TCP socket通信流程图

wKiom1krjKWxBjEiAAJCVhCWnCg132.jpg

以下是python伪代码

wKioL1krjWuxw8j4AACZEqW9BQ8198.png

以下是一个基本的tcp socket服务端和客户端代码示例

#!/usr/bin/env python# _*_coding:utf-8_*_'''

* Created on 2017/5/23 21:59.

* @author: Chinge_Yang.

'''# 服务器端import socket

server = socket.socket()

server.bind(('localhost', 6969))  # 绑定要监听的端口

server.listen()  # 监听

conn, addr = server.accept()  # 等待连接# conn是客户端连接过来,在服务端生成的一个连接实例

data = conn.recv(1024)  # 1024字节

print("recv:", data)

conn.send(data.upper())

server.close()

#!/usr/bin/env python# _*_coding:utf-8_*_'''

* Created on 2017/5/23 21:55.

* @author: Chinge_Yang.

'''# 客户端import socket

client = socket.socket()  # 声明socket类型,同时生成socket链接对象

client.connect(('localhost', 6969))

client.send("Hello world!".encode("utf-8"))

data = client.recv(1024)  # 1024字节

print("recv:", data.decode())

client.close()

socket server并发实例

import socketserver  # 导入socketserver模块class MyServer(socketserver.BaseRequestHandler):  # 创建一个类,继承自socketserver模块下的BaseRequestHandler类

def handle(self):  # 要想实现并发效果必须重写父类中的handler方法,在此方法中实现服务端的逻辑代码(不用再写连接准备,包括bind()、listen()、accept()方法)

while 1:

conn = self.request

addr = self.client_address

# 上面两行代码,等于 conn,addr = socket.accept(),只不过在socketserver模块中已经替我们包装好了,还替我们包装了包括bind()、listen()、accept()方法

while 1:

accept_data = str(conn.recv(1024), encoding="utf8")

print(accept_data)

if accept_data == "byebye":

break

send_data = bytes(input(">>>>>"), encoding="utf8")

conn.sendall(send_data)

conn.close()if __name__ == '__main__':

sever = socketserver.ThreadingTCPServer(("127.0.0.1", 8888),

MyServer)  # 传入 端口地址 和 我们新建的继承自socketserver模块下的BaseRequestHandler类  实例化对象

sever.serve_forever()  # 通过调用对象的serve_forever()方法来激活服务端

import socket

sk = socket.socket()

sk.connect(("127.0.0.1", 8888))  # 主动初始化与服务器端的连接while True:

send_data = input("输入发送内容:")

sk.sendall(bytes(send_data, encoding="utf8"))

if send_data == "byebye":

break

accept_data = str(sk.recv(1024), encoding="utf8")

print("".join(("接收内容:", accept_data)))

sk.close()

5. Python Internet 模块

以下列出了 Python 网络编程的一些重要模块:

协议

功能用处

端口号

Python 模块

HTTP

网页访问

80

httplib, urllib, xmlrpclib

NNTP

阅读和张贴新闻文章,俗称为”帖子”

119

nntplib

FTP

文件传输

20

ftplib, urllib

SMTP

发送邮件

25

smtplib

POP3

接收邮件

110

poplib

IMAP4

获取邮件

143

imaplib

Telnet

命令行

23

telnetlib

Gopher

信息查找

70

gopherlib, urllib

本文转自 ygqygq2 51CTO博客,原文链接:http://blog.51cto.com/ygqygq2/1930545,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

REST / HTTP方法:POST与PUT与PATCH

每个HTTP请求都包含一个方法 (有时称为verb ),该方法指示对标识的资源执行的操作。 在构建RESTful Web服务时,HTTP方法POST通常用于创建资源,而PUT用于资源更新。 尽管在大多数情况下这很好,但使用PUT进行…

判断frame是否已创建_类的创建

1. 士兵 许三多 有一把 AK47 2. 士兵 可以开火 3. 枪 能够 发射 子弹 4. 枪 装填 子弹---增加子弹数量 class Gun:def __init__(self,type):self.type type# 刚开始枪没有子弹self.bullet_count 0def __str__(self):return ("%s 已到位" % self.type)def shoot(sel…

mysql 安装盒子_Windows2008 装 MySQL 问题

昨天在2008里装MySQL,遇以了一些问题,装的是mysql-5.6.20-winx64.msi版本,不知道是版本太新还是兼容,还是系统权限配置问题,老是报错,多数是杂乱的错误,这里主要记一下MySQL的错误:安…

@select注解_Mybatis基本知识十七:Mybatis注解式开发-单表注解式开发

上一篇文章:《Mybatis基本知识十六:查询缓存之第三方查询缓存》若文中有纰漏,请多多指正!!!1.前言使用Mybatis进行开发,不仅可以使用mapper配置文件进行开发,也可以使用注解的方式。映射文件中无…

mysql主从切换机制torch_MySQL Replication设置(Master/Slave)实现主从复制

一、Master配置1、my.cnf配置# vim /etc/mysql/mariadb.conf.d/50-server.cnf[mysqld]log-binmysql-bin //[必须]启用二进制日志server-id140 //[必须]服务器唯一ID,默认是1,一般取IP最后一段2、重启mysqlsudo service mysql restart3、在主服务器上建立…

junit测试线程_一个在自己的线程中运行测试的JUnit规则

junit测试线程有时,能够在单独的线程中运行JUnit测试会很有帮助。 特别是在编写与封装的ThreadLocal或类似对象进行交互的集成测试时,这可能会派上用场。 单独的线程将隐式确保每次测试运行都未初始化threadlocal的与线程相关的引用。 这篇文章介绍了提供…

maven servlet配置_第一个Servlet配置

使用IntelliJ IDEA创建一个Simple Maven项目2. Add Framework Support3. 配置Tomcat打开菜单Run -> 选择Edit Configuration 如果侧边栏没有Tomcat,点击“”号 -> 选择“Tomcat Server” -> 选择“Local”,到此画面 ,Apply -> OK4. 在Tomcat…

如何将四元数方向转化为旋转举证_是否有将四元数旋转转换为欧拉角旋转的算法?...

frodo2975..7我一直在寻找类似解决方案的几天,我终于遇到了这个网站,它有一个将四元数转换为任意Euler和Tait-Bryan旋转的算法!这是代码:///// Quaternion to Euler///enum RotSeq{zyx, zyz, zxy, zxz, yxz, yxy, yzx, yzy, xyz, xyx, xzy,xzx};void twoaxisrot(double r11, do…

使用Spring Boot和DJL进行深度学习

总览 这是Spring Boot上的另一篇文章 ,该文章将展示如何使用Deep Java Library (DJL)构建示例Web应用程序, Deep Java Library (DJL)是Java的开源深度学习库,用于诊断X射线图像上的COVID-19。 …

ad域管理与维护_U-Mail邮件系统LDAP/AD同步极大提升办公效率

每一位办公族,可能都遇到过这样的问题:1、随着信息化高速发展和企业“互联网”的深入,越来越多的办公平台和软件被开发出来,正如移动互联网端APP应用层出不穷一样,给人们带来了极大地便利性。2、凡事有利有弊&#xff…

r java_如何在R中使用JAVA写的程序包?

不过我对 Java 真的不太熟悉,按照教程调用这个 LLDA 包之后只会使用 inferencer。如果你不嫌麻烦可以考虑先用 Java 计算出结果,然后在 R 中载入这些结果.具体步骤如下:0 - 文件夹 JGibbLDA-v.1.0 放在 R 的工作目录下。1 - 用 JDK 和他提供的…

c语言c99标准_C语言的灵魂指针,配合这个新增的关键字,能够生成更高效的程序...

正如我前面的文章提到的,C语言虽然已经比较成熟,但是近些年来也是有所发展的——比如增加了许多新特性。遗憾的是,可能因为C语言程序员的工资比不过互联网程序员,国内很多教材比较老旧,几乎不涉及近些年来C语言新增的新…

java ee的小程序_Java EE 8 –为更多设备提供更多应用程序

java ee的小程序如果我不喜欢夏天的一件事,那就是事实是没有太多要分享或谈论的新闻。 谁决定将Java Day Tokyo置于今年的这个无聊的时间里,做得很好,并给了我一个写关于新的和即将到来的Java EE 8规范的博客帖子的机会,其中丰富了…

java随机姓名_Java生成随机姓名、性别和年龄的实现示例

一、定义实体类Person,封装生成的数据package net.dc.test;public class Person {private String name;private String sex;private int age;public String getName() {return name;}public void setName(String name) {this.name name;}public String getSex() {r…

matlab 图像 幅度谱 低通滤波_数字图像处理期末复习2018-12-21

数字图像处理期末复习2018-12-21愉快先生0.204字数 5547 阅读 18342018-12-22 19:35(数字图像冈萨雷斯第二版教材)一、基本原理图像的读取、存储操作:i imread(filename) ; imwrite(i,’image.jpg’); 图像显示的⽅法及区别:imshow(i); imshow(i,[]);%0…

带有HttpClient的自定义HTTP标头

在Apache HTTPClient请求中设置自定义HTTP标头的快速指南。 在HttpRequest上,调用setHeader()方法以将HttpHeaders内容类型设置为JSON。 适用于各种版本的HttpClient(4.3之前和之后)。 1.简介 在本教程中,…

java 递归深度优先遍历_Java基础 - 二叉树的遍历之深度优先遍历(递归遍历)

package com.yc.test;import java.util.ArrayList;import java.util.List;import com.yc.tree.ThreeLinkBinTree;import com.yc.tree.ThreeLinkBinTree.Node;/**** author wb**遍历二叉树指的是按某种规律依次访问二叉树的每个节点,对二叉树的遍历过程就是将非线性结…

大话oraclerac集群、高可用性、备份与恢复_Oracle RAC结构

Oracle RAC结构Oracle真正集群的出现是在Oracle公司收购Rdb并吸收了相关技术优势后,才正在推出了属于自己的RAC集群解决方案。RAC​和集群分类章节提到的集群系统有很多相似之处,从下图我们大概了解一下RAC集群的层次结构和所需的软硬件环境。Oracle Rac…

java obix_obix协议在java中的配置和使用详解

前言本文主要给大家介绍的是关于obix协议在java中的配置和使用,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。什么是 oBIX?简单来讲,obix是一种 XML 通讯协议,使用Http Request/Post方式进行数据通…

java7和java8切换_仍不切换到Java 8的6个理由

java7和java8切换Java 8很棒。 期。 但是……在我们有机会玩耍并玩弄它之后,就该退出了,避免吃盐。 所有的好东西都是有代价的,在这篇文章中,我将分享Java 8的主要痛点。请确保在升级和释放7之前您已经意识到了这些痛点。 1.并行…