Python3 Socket
Socket
socket介绍
socket意为套接字,是应用层与传输层TCP/IP,UDP之间通信的中间软件抽象层,它是一组接口。使用时只需遵循socket的格式与规定去编程,让socket组织数据以符合TCP/UDP协议进行数据的传输。

socket的工作流程

先从服务端说起,服务端先初始化socket --> 为此socket绑定端口(bind) --> 监听此端口(listen) --> 调用accept阻塞socket,直到有客户端连接 --> 如果此时客户端连接成功(connect),即与服务端完整建立连接,即可开始发送数据请求(write) --> 服务器端接收请求并处理请求(read),然后把回应数据发送给客户端(write) --> 客户端读取响应内容(read) --> 关闭连接,交互结束(close)
scoket初始化->socket.socket()
socket.socket(socket_family,socket_type,protocal=0)
socket_family
AF_INET(ipv4)
AF_INET6 (ipv6)
AF_UNIX(UNIX之间通信,绝对路径名)
socket_type
# SOCK_STREAM 提供有序的、可靠的、双向的和基于连接的字节流服务,当使用Internet地址族时使用TCP;一般为面向连接的TCP
# SOCK_DGRAM 支持无连接的、不可靠的和使用固定大小(通常很小)缓冲区的数据报服务,当使用Internet地址族使用UDP;一般为非连接的UDP
# SOCK_RAW 原始套接字,允许对底层协议如IP或ICMP进行直接访问,可以用于自定义协议的开发。
protocal
# IPPROTO_TCP,TCP协议
# IPPROTO_UDP,UPD协议
# 0,如果指定为0,表示由内核根据so_type指定默认的通信协议
TCP/IP+ipv4
s.socket(socket.AF_INET, socket.SOCK_STREAM)
服务端套接字
s.bind()
用于绑定(主机/ip,端口)到socket套接字, 在AF_INET下,以元组(host,port)的形式表示地址。
s.bind(('xxx.xxx.xxx.xxx',port))
s.listen()
开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
ps:udp不支持listen()
s.listen(5)
s.accept()
被动接受TCP客户端连接,(阻塞式)等待连接的到来
ps: udp不支持
conn,addr = s.accept()
关于accept()返回值在官方文档是这么说的
The return value is a pair (conn, address) where conn is a new socket object usable to send and receive data on the connection, and address is the address bound to the socket on the other end of the connection.
有两个返回值conn和address,第一个返回值为新的 socket 对象可用于发送和接受数据,形式大致如下
<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.124.141', 12345), raddr=('192.168.124.1', 15563)>
address为一个元组,元组包含远端连接的ip地址和端口,形如
('192.168.124.1', 15563)
客户端套接字
s.connect()
主动初始化TCP服务器连接。一般address的格式为元组(主机/ip,port),如果连接出错,返回socket.error错误。
s.connect(('192.168.124.1',22222))
s.connect_ex()
connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
公共用途的套接字函数
s.recv()
socket.recv(bufsize[, flags])
从套接字接收数据。返回值是表示接收到的数据的bytes对象。bufsize指定一次接收的最大数据量。一般为1024
s.recv(1024)
s.send()
发送数据,将数据发送到socket套接字。(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.send('This is Socket Client!'.encode('utf-8'))
s.sendall()
发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.close()
关闭socket 套接字
简单例子 TCP连接
SocketServer.py
#!/usr/bin/python3
#-*- coding:UTF-8 -*-
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.bind(('192.168.124.141',12345))
phone.listen(5)
conn,addr=phone.accept()
print(conn,addr)
print('Remote IP Address is',addr)
client_msg=conn.recv(1024)
print('client msg: %s' %client_msg)
conn.send(client_msg。upper())
conn.close()
s.close()
SocketClient.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.124.141', 12345))
s.send('this is socket client!'.encode('utf-8'))
res_msg = s.recv(1024)
print(res_msg)
s.close
服务端

客户端

简单例子UDP连接
SocketServer.py
#!/usr/bin/python3
#-*- coding:UTF-8 -*-
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
ip = '192.168.124.141'
port = 12346
s.bind((ip,port))
recv_data,addr = s.recvfrom(1024)
print('Client Send Message: %s' %recv_data)
server_send_data = 'this is server!!!'
s.sendto(server_send_data.encode(),addr)
s.close()
SocketClient.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto('this is socket client!!!'.encode('utf-8'),('192.168.124.141',12346))
res_msg,addr = s.recvfrom(1024)
print(res_msg)
s.close()
服务端

客户端

Python3 Socket的更多相关文章
- Python3 socket网络编程(一)
Socket的定义 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并进行连接,如发送和接受数据.为了建 ...
- python3+socket搭建简易服务器
踩了一上午的坑之后,终于对网络编程有了一点大致的.基本的了解.真的是0基础,之前对socket网络编程一点都不知道.(感觉自己与时代脱轨....) 首先我想对这些美妙的专业术语进行一番搜索: 服务器: ...
- Python3 Socket和SocketServer 网络编程
socket只能实现同时一个服务和一个客户端实现交互,socketserver可以实现多个客户端同时和服务端交互 1.利用Socket编写简单的同一个端口容许多次会话的小案例: 服务端: #!/usr ...
- Python3 Socket网络编程
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. socket起源于UNIX,在 ...
- python3.* socket例子
On Server: # -*- coding: utf-8 -*-#this is the server import socketif "__main__" == __name ...
- python3(socket 实现udp,tcp套接字编程)
#coding=utf-8 #客户端程序TCP 连接 import socket s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connec ...
- python【第八篇】socket网络编程
内容大纲 1.socke基础 两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建 立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API ...
- Python3 实现数据读写分离设计
前言 首先读写分离可以保证数据库的稳定,简单的说就是当网站访问量大时,读写都在一个库,很有可能会出现脏数据的情况,如果采取阻塞似操作,那么用户体验就会变得更差. 而且目前大多数网站的读写是失衡的,以淘 ...
- Python Socket网络编程详解
Socket 简介 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. s ...
随机推荐
- RocketMQ单节点搭建
RocketMQ服务搭建 下载RocketMQ源码: http://mirror.bit.edu.cn/apache/rocketmq/4.4.0/rocketmq-all-4.4.0-source- ...
- 手撸ORM浅谈ORM框架之Update篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- Java进阶面试
消息中间件: 1.你们公司生产环境用的是什么消息中间件? https://mp.weixin.qq.com/s?__biz=MzU0OTk3ODQ3Ng==&mid=2247484149&am ...
- JUC---10JMM
前提:什么是Volatile? Java 虚拟机提供轻量级的同步机制 1.保证可见性------->JMM 2.不保证原子性 3.禁止指令重排 一.什么是JMM 1.JMM : Java内存模型 ...
- oracle基本学习
oracle目录及卸载 1.oracle的目录介绍: oradata:数据库存储文件的目录 db_home: network >admin:配置网络服务和监听器服务 jdk:oracle自带jd ...
- MySQL图形界面客户端
图形界面客户端 使用图形界面客户端操作数据库更直观.方便.下面三个客户端都能操作MySQL,各有各自的优点. 1.Navicat Premium 下载安装包下载 关注公众号[轻松学编程],然后回复[n ...
- git/SQL/正则表达式的在线练习网站
虽说我没事就喜欢喷应试教育,但我也从应试教育中发现了一个窍门:如果能够以刷题的形式学习某项技能,效率和效果是最佳的.对于技术的学习,我经常面临的困境是,理论知识知道的不少,但是有的场景实在无法模拟,缺 ...
- POJ2430 Lazy Cows
题意描述 Lazy Cows 给定一个 \(2\times b\) 的矩形,和 \(n\) 个矩形上的点. 要求你用 \(k\) 个矩形覆盖这 \(n\) 个点,使得每个点都被覆盖的前提下这些矩形的面 ...
- numpy矩阵
一.创建矩阵 Numpy提供了ndarray来进行矩阵的操作,在Numpy中 矩阵继承于NumPy中的二维数组对象,但矩阵区别于数组,不可共用数组的运算规律. 1.mat("第0行:第1行: ...
- Java 实现输入公历日期输出农历日期、生肖、天干地支、节日、节气等信息
最近的工作中客户要求前台页面展示日历,日历内容包括:农历年月日日.公历年月日.生肖.天干地支.农历节日.公历节日.24节气等信息,之前在网上查找资料关于Java实现方面的文章不少,但是大多数针对节气. ...