网络编程基础之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:流控制 ...
随机推荐
- gradle 构建包含源码配置
参考配置: apply plugin: "idea" apply plugin: "groovy" apply plugin: "eclipse&qu ...
- cocostudio ui编辑器 使用心得
1 c++包含路径 2九宫格设置 cocostudio ui编辑器设置九宫格x,y,w,h是从图片左上角开始测量,然后调整尺寸就行了. 2. 如果点了自适应 panel会在加载json的时候被设置 ...
- 【转】MFC对话框和控件
原文网址:http://www.cnblogs.com/tiwlin/archive/2013/05/08/3067966.html 对话框和控件 对话框是Windows应用程序中一种常用的资源,其主 ...
- bzoj 3671 [Noi2014]随机数生成器——贪心(时间复杂度分配)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3671 设 x 为一个点的行号, y 为一个点的列号:原本想着判断一个点能不能选就是看选了的点 ...
- pat1022__字符串查找
主要是对字符串的查找,为了方便并且快速的实现查找,用map会比较方便 同时如何把一个带有空格的字符串变成多个单词也有一个小技巧 char *point=book[i].keyWord;//关键词分离 ...
- EF6:编写你自己的code first 数据迁移操作(睡前来一篇,翻译的)
原英文版由EF团队成员 Rowan Miller 在2013年发表,此处只作翻译备忘. 数据迁移提供了一套强类型API,用于执行通用的操作,比如CreateIndex("dbo.Blogs& ...
- json.loads(s) returns error message like this: ValueError: Invalid control character at: line 1 column 33 (char 33)
json.loads(s) returns error message like this: ValueError: Invalid control character at: line 1 colu ...
- 30个让人兴奋的视差滚动(Parallax Scrolling)效果网站--转
视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验.作为今年网页设计的热点趋势,越来越多的网站应用了这项技术.今天这篇文章就与大 ...
- 同步机制之--java CyclicBarrier 循环栅栏
CyclicBarrier介绍一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待 ...
- Jquery获取用户控件页面中控件的值
$('#<%= txt_P_name.ClientID%>').val()