网络编程

1.基本概念

1.什么是客户端/服务器架构?

服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。它存在唯一目的就是等待客户端的请求,

并响应它们(提供服务),然后等待更多请求。

一个提供服务,一个请求服务得到相应的过程。

2.套接字:通信端点

套接字,就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。

一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。

从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通

信的接口,是应用程序与网络协议栈进行交互的接口。

  • python只支持AF_UNIX、AF_NETLINK、AF_TIPC 和 AF_INET ,重点使用基于网络的AF_INET

  • 套接字地址:主机-端口对(有效端口范围为0~65535)

3.套接字类型

  • 流式套接字(SOCK_STREAM):用于提供面向连接、可靠的数据传输服务。

  • 数据报套接字(SOCK_DGRAM):提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。

Python中的网络编程

首先介绍一下socket()模块函数

要创建套接字,必须使用socket.socket()函数,它一般的语法如下

socket(socket_family, socket_type, protocol=0)

socket_family如下(部分):

  • socket.AF_UNIX:用于同一台机器上的进程通信(既本机通信)
  • socket.AF_INET:用于服务器与服务器之间的网络通信
  • socket.AF_INET6:基于IPV6方式的服务器与服务器之间的网络通信

socket_type如下:

  • socket.SOCK_STREAM:基于TCP的流式socket通信
  • socket.SOCK_DGRAM:基于UDP的数据报式socket通信

套接字的内置方法

创建服务和客户端

  • 创建TCP服务
ss = socket()   # 创建服务器套接字
ss.bind() # 套接字与地址绑定
ss.listen() # 监听
cs = ss.accept() # 接收客户端连接
cs.recv()/cs.send() # 对话(接收/发送)
cs.close() # 关闭客户端套接字(可选)
ss.close() # 关闭服务器套接字(可选)
  • 创建TCP客户端
cs = socket()       #  创建客户端套接字
cs.connect() # 尝试连接服务器
cs.send()/cs.recv() # 对话(发送 / 接收)
cs.close() # 关闭客户端套接字

代码示例

# TCP服务
import socket
import threading IP = ""
PORT = 80 def main():
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((IP, PORT))
server.listen(5)
print(f"[*] Listening on {IP}:{PORT}") while True:
client, address = server.accept()
print(f"[*] Accepted connection from {address[0]}:{address[1]}")
client_header = threading.Thread(target=handle_client, args=(client, ), daemon=True)
client_header.start() def handle_client(client_server):
with client_server as sock:
request = sock.recv(1024)
print(f'[*] Received: {request.decode("utf-8")}')
send = "服务器端"
sock.send(send.encode("utf-8")) if __name__ == '__main__':
main()
# TCP 客户端
import socket target_host = "127.0.0.1"
target_port = 80 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
client.connect((target_host, target_port)) send = "客户端"
client.send(send.encode("utf-8"))
response = client.recv(4096)
print(response.decode())
except:
print("连接失败!")
finally:
client.close()

可以根据自己的想法进行扩展,例如持续连接进行交互,根据自己的要求进行断开连接,此时可以在客户端加个while True:

和一个判断语句,等等

Python socket记录的更多相关文章

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

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

  2. python/socket编程之粘包

    python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 发送端可以是1k,1k的发送数据而接受端的应用程序可以2k,2k的提 ...

  3. Python Socket 编程——聊天室演示样例程序

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

  4. Python Socket 基础多用户编程

    简介   写下这篇小记的原因是想记录一下自己学习Python Socket编程的心路历程.之前在中专的时间学过一些基础的Socket编程,知道了一些比较基础的内容比如基础的socket.bind()类 ...

  5. Python Socket 网络编程

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

  6. Python学习记录day6

    title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...

  7. Python学习记录day5

    title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...

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

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

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

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

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

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

随机推荐

  1. Java面试——消息队列

    一.消息队列的使用场景 ☞ 以下介绍消息队列在实际应用常用的使用场景.异步处理.应用解耦.流量削锋和消息通讯四个场景.[1]异步处理:场景说明:用户注册后,需要发注册邮件和注册短信.  引入消息队列后 ...

  2. Java 面试——Zookeeper

    一.Zookeeper 实现机制 文件系统 + 通知机制 二.Zookeeper 高可用实现原理 一个 ZooKeeper 集群如果要对外提供可用的服务,那么集群中必须要有过半的机器正常工作并且彼此之 ...

  3. STL常用容器用法总结

    vector 变长数组,倍增的思想 size() 返回元素个数 empty() 返回是否为空 clear() 清空 front()/back() push_back()/pop_back() begi ...

  4. spark中的持久化机制以及lineage和checkpoint(简含源码解析)

    spark相比MapReduce最大的优势是,spark是基于内存的计算模型,有的spark应用比较复杂,如果中间出错了,那么只能根据lineage从头开始计算,所以为了避免这种情况,spark提供了 ...

  5. Go语言:一文看懂什么是DI依赖注入(dependency injection)设计模式

    前言: 本文主要介绍的是Goalng中关于 DI 的部分,前一部分会先通过典型的面向对象语言Java引入DI这个概念 仅供初学者理解使用,文章如有纰漏敬请指出 本文涉及到的知识面较为零散,其中包含面向 ...

  6. el-tree组件过来吧默认打开全部子节点

    //搜索到节点必须打开此节点所有子节点,因为默认是不会打开子节点的,所以手动设置打开的最高层级.本次我设置了最大四个层级 filterNode(value,data,node) { if(!value ...

  7. 四月二十六java基础知识

    1..对文件的随机访问:前面介绍的流类实现的是磁盘文件的顺序读写,而且读和写分别创建不同的对象,java语言中还定义了一个功能强大.使用更方便的随机访问类RandomAcessFile它可以实现文件的 ...

  8. LeeCode哈希问题(二)

    LeeCode 454: 四数相加II 题目描述 给你四个整数数组 nums1.nums2.nums3 和 nums4,数组长度均为 n ,请你计算有多少个元组 (i, j, k, l) 能满足: \ ...

  9. Java学习笔记06

    1. 类和对象 1.1 类和对象 ​ 客观存在的事物皆为对象,所以我们也常常说万物皆对象. 类 类的理解 类是对现实生活中一类具有共同属性和行为的事物的抽象 类是对象的数据类型,类是具有相同属性和行为 ...

  10. oss/obs对象存储上传图片,在浏览器输入地址却是下载图片。不能直接在浏览器上查看。

    1.问题oss/obs对象存储上传图片获取链接地址后,在浏览器输入地址却是下载.不能直接在浏览器上面浏览图片信息.2.解决上传文件的时候需要设置:content-type类型,需要指示浏览器这是什么类 ...