网络编程基础之Socket套接字
一、Socket介绍
1、什么是socket?
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部。
当你想给另一台计算机发消息,你知道他的IP地址,而他的机器上运行着多个软件,如QQ、迅雷等,那当你通过qq发消息给他时,消息通过ip地址到达他的电脑,那他的电脑怎样把消息给指定的QQ程序呢?答案就是port,即端口,一个机器上可以有66535个端口,你的程序要想从网络上收发数据,必须绑定一个端口,这样,远程设备发到这个端口上的数据,就会转给这个程序。
如下图所示:

2、socket通信
当两台机器通过socket建立连接后,主要做两件事,一个是收数据,一个是发数据,没数据时就等着。
· 我们可以通过打电话模拟这个过程:
打电话方(socket客户端)
1、你必须先有个电话(生成socket对象)
2、输入你想拨打的电话(connect 远程主机的ip和port)
3、等待对方接听
4、say"hello ,do you have time?"(send()发送消息)
5、等待回应-->响应回应-->等待回应...
接电话方(socket服务端)
1、同样首先你得有个电话(生成socket对象)
2、你需要绑定你的电话号码(绑定本机的ip和port)
3、你的电话必须接上电话线(连网)
4、等电话(监听电话 listen)
5、电话铃声响了,接听电话,听到“hello,do you have time?”(接受连接)
3、socket通信完整过程

二、Socket套接字方法
1、socket实例类
socket.socket(family=AF_INET,type=SOCK_STREAM)
family(socket家族)
socket.AF_UNIX:用于本机进程间通讯,为了保证程序安全,两个独立的程序(进程)间是不能互相访问彼此的内存的,但为了实现进程间的通讯,可以通过创建一个本地的socket来完成。
socket.AF_INET:还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,其他的很少用到,但是我们现在只关心网络编程,所以大部分时候只使用AF_INET。
socket type类型
socket.SOCK_STREAM 用于TCP
socket.SOCK_DGRAM 用于UDP
socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。
socket.SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。
2、服务端套接字函数
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户的连接,等待连接的到来
3、客户端套接字函数
s.connect() 初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常。
4、公共的套接字函数
s.recv() 接收数据
s.send() 发送数据(当待发送数据大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() 发送完整的TCP数据(本质就是循环调用send,数据不丢失,直到发完)
s.recvfrom() 从套接字接收数据。返回值是一对(字节,地址)
s.getpeername() 连接到当前套接字的远端的地址
s.close() 关闭套接字
socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0) 返回远程主机的地址信息,例子 socket.getaddrinfo('luffycity.com',80)
socket.getfqdn() 拿到本机的主机名
socket.gethostbyname() 通过域名解析ip地址
socket.setblocking(flag) #True or False,设置socket为非阻塞模式,io异步时会用
三、一个简单的socket套接字实例
# 服务端.py #!/usr/bin/env python3
#-*- coding:utf-8 -*-
# write by congcong import socket
'''
在此服务端有两个套接字,一个是 phone 绑定,监听,获取链接;另一个是 conn 收发消息
而 客户端只有一个套接字,就是 phone
'''
#1、 买手机
tel = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
#2、绑定手机卡
tel.bind(('127.0.0.1',8081))
#3、开机
tel.listen(5)
#4、等待连通
conn,client = tel.accept()
#5、收发消息
data = conn.recv(1024)
print('收到来自客户端的消息',data) # 收到来自客户端的消息 b'hello world'
conn.send(data.upper())
#6、挂断
conn.close()
#7、关机
tel.close()
# 客户端.py #!/usr/bin/env python3
#-*- coding:utf-8 -*-
# write by congcong import socket
# 1、买手机
phone = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM) # 2、打电话(客户端无固定IP和端口,所有不需要绑定)
phone.connect(('127.0.0.1',8081)) # 3、发收消息
phone.send('hello world'.encode('utf-8'))
data = phone.recv(1024)
print('收到来自服务端的消息',data) # 收到来自服务端的消息 b'HELLO WORLD' # 4、关机
phone.close()
网络编程基础之Socket套接字的更多相关文章
- 网络编程基础之Socket套接字简单应用
一.Socket套接字实现通信循环 所谓通信循环,简单理解就是客户端可以给服务端循环发送信息并获得反馈的过程. 1.基础版 通信循环的程序分为两部分,即两个python模块,分别为客户端.py和服务端 ...
- 网络编程基础之socket套接字编程实现同一IP下的信息传输
鲁照山 1.网络协议的5层模型,每层内容的整理 2.画图描述三次握手四次挥手,和C端S端的状态 3.写一个客户端,实现给服务端发送hello world 字符串, 写一个服务端,将客户端发送的数据变成 ...
- 网络编程初识和socket套接字
网络的产生 不同机器上的程序要通信,才产生了网络:凡是涉及到倆个程序之间通讯的都需要用到网络 软件开发架构 软件开发架构的类型:应用类.web类 应用类:qq.微信.网盘.优酷这一类是属于需要安装的桌 ...
- [转载] 读《UNIX网络编程 卷1:套接字联网API》
原文: http://cstdlib.com/tech/2014/10/09/read-unix-network-programming-1/ 文章写的很清楚, 适合初学者 最近看了<UNIX网 ...
- 从零开始学Python第八周:网络编程基础(socket)
Socket网络编程 一,Socket编程 (1)Socket方法介绍 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Soc ...
- 第1章 网络编程基础(2)——Socket编程原理
Socket编程原理 Socket是网络通信端点的一种抽象,它提供了一种发送和接收数据的机制. 流socket(SOCK_STREAM):双向.有序.无重复.并且无记录边界 数据报Socket(SOC ...
- python网络编程基础之socket粘包现象
粘包现象两种 登陆 #服务端import json import socket server=socket.socket()#创建socket对象 ip_port=('127.0.0.1',8001) ...
- java tcp ip网络编程(二) 套接字的基本使用
##基本套接字的使用 linux系统把网络io抽象成socket,对网络的编程就是对socket的编程. java把套接字抽象成类似的类 InetAddress SocketAddress 识别jav ...
- 《Unix网络编程卷1:套接字联网API》读书笔记
第一部分:简介和TCP/IP 第1章:简介 第2章:传输层:TCP.UDP和SCTP TCP:传输控制协议,复杂.可靠.面向连接协议 UDP:用户数据报协议,简单.不可靠.无连接协议 SCTP:流控制 ...
随机推荐
- for(j=0,i=0;j
for(j=0,i=0;j<6,i<10;j++,i++) { k=i+j; } k 值最后是多少? <script type="text/javascript" ...
- callback回调函数-python
链接:http://www.zhihu.com/question/19801131/answer/27459821来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 编程分 ...
- Python中super()和__init__()方法
采用新式类,要求最顶层的父类一定要继承于object,这样就可以利用super()函数来调用父类的init()等函数, 每个父类都执行且执行一次,并不会出现重复调用的情况.而且在子类的实现中,不用到处 ...
- pycharm中import动态链接库pyd有错误
有红色波浪线提示unsolved reference云云 去setting里面设置interpreters, 在path里面添加对应的路径, 是包含对应头文件的路径, 不要忘记右边的小按钮去Relo ...
- 转发 GSLB概要和实现原理
What is GSLB Global Server Load Balancing 中文:全局负载均衡 SLB(Server load balancing)是对集群内物理主机的负载均衡,而GSLB是对 ...
- python之面向对象(继承)
类的继承 python之面向对象(继承) 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制.继承完全可以理解成类之间的类型和子类型关系. 需要注意的地方:继承语法 c ...
- 初探babel转换器的安装与使用
一.配置.babelrc文件(没有名字的文件) Babel的配置文件是.babelrc,存放在项目的根目录下.使用Babel的第一步,就是配置这个文件. 基本格式如下: { "presets ...
- php-PSR
<?php/** * 符合psr-1,2的编程实例 */ namespace Standard; // 顶部命名空间// 空一行use Test\TestClass;//use引入类 /** * ...
- 窗口点击模拟a
[问题描述] 在计算机屏幕上,有N 个窗口.窗口的边界上的点也属于该窗口.窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容.当你用鼠标点击屏幕上一个点的时候,若其在窗口 ...
- java多线程(1) 线程的基本概念
一.线程的基本概念: 线程是一个程序里面不同的执行路径. 程序里面不同的执行路径,每一个分支都是一个线程. 进程:静态的概念.机器上的一个class文件,机器上的一个exe文件,这叫一个进程. 机 ...