铁乐学Python_Day33_网络编程Socket模块1

部份内容摘自授课老师的博客http://www.cnblogs.com/Eva-J/

理解socket

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。

在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,

对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

其实站在你的角度上看,socket就是一个模块。

我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。

也有人将socket说成ip+port,

因为ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序。

所以我们只要确立了ip和port就能找到一个应用程序,并且使用socket模块来与之通信。

套接字(socket)的发展史

套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。

因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。

一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。

这也被称进程间通讯,或 IPC。

套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。

基于文件类型的套接字家族

套接字家族的名字:AF_UNIX

unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,

两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信。

基于网络类型的套接字家族

套接字家族的名字:AF_INET

还有AF_INET6被用于ipv6,还有一些其他的地址家族,

不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,

所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,

但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET。

socket选择使用tcp或udp协议

TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、

传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。

使用TCP的应用:Web浏览器;电子邮件、文件传输程序。

UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),

一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。

使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。

套接字(socket)初使用

基于TCP协议的socket

谨记:tcp是基于连接的,必须先启动服务端,然后再启动客户端去连接服务端。

例:tcp协议聊天(一对一)-server端代码

import socket
from socket import SOL_SOCKET, SO_REUSEADDR '''
实例化一个socket模块中的socket类的对象,为便于区别,在服务端我起名server
可比喻为买手机
'''
server = socket.socket() '''
此socket配置要在bind之前,用处是表示重用ip和端口,
防止上次异常退出后再启动报地址在使用或端口被占用之类的错误
可比喻为实名认证后下面的手机号码就属于你的了
'''
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) '''
表示服务端捆绑的ip地址与端口,在这里为本机测试故填回环地址127.0.0.1,
端口是int类型的可用端口范围内的数字,
可比喻为买手机卡.
'''
server.bind(('127.0.0.1', 9527)) # 表示开启侦听
server.listen() # 可比喻为手机开机,能接收到信号了 # 同意接收客户端链接,并将客户端的链接信息赋给两个变量
conn, addr = server.accept() # 好奇的话可以print打印看看分别是什么
print(conn)
'''
拿到的是类似这样的,链接过来的客户端信息:
<socket.socket fd=300, family=AddressFamily.AF_INET,
type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9527),
raddr=('127.0.0.1', 61463)>
''' print(addr)
# 拿到的是一个元组,里面包含有客户端ip和端口('127.0.0.1', 61463)
# 做成循环模式,以便不断交互对话
print('这里是服务端') while 1:
# 接收客户端发送过来的字节信息
ret = conn.recv(1024) # 如果客户端发送q/Q过来,表示退出聊天
if ret.upper == 'Q': break # 打印并解码显示出来
print(ret.decode('utf-8')) # 服务端这边也做成可以输入反馈开始尬聊,一人一句
res = input('>>>').strip() # send方法代表发送消息过去客户端,需要转码
conn.send(res.encode('utf-8')) # 自己这方也可以发送中止信号
if res.upper() == 'Q':break conn.close()
server.close() tcp协议聊天(一对一)- client端代码 import socket client = socket.socket()
ip = input('输入服务端ip:')
port = input('输入端口:')
# 通过ip和端口连接服务端
client.connect((ip, int(port)))
print('这里是客户端')
while 1:
res = input('>>>').strip()
# 客户端传送消息给服务端
client.send(res.encode('utf-8'))
if res.upper() == 'Q':
break
# 客户端接收服务端传过来的消息
ret = client.recv(1024)
if ret.upper() == 'Q':
break
print(ret.decode('utf-8'))
client.close() 基于UDP协议的socket
udp不是基于连接的,启动服务之后可以直接接受消息,不需要提前建立连接。 udp协议-服务端代码:
import socket from socket import SOL_SOCKET, SO_REUSEADDR
# 实例化socket对象,type=socket.SOCK_DGRAM表示协议为udp
udp_server = socket.socket(type=socket.SOCK_DGRAM)
udp_server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
ip = input('请输入服务端侦听ip:').strip()
port = input('请输入服务端侦听端口:').strip()
udp_server.bind((ip, int(port)))
print('这里是服务端')
# udp 并不需要像tcp的connect先行连接 while 1:
# 和tcp不同,udp的接收方法是recvfrom
msg, addr = udp_server.recvfrom(1024)
if msg.upper == 'Q':
break
print(addr, msg.decode('utf-8'))
res = input('>>>').strip()
# 同样不同的是tcp发送是send,udp是sendto
udp_server.sendto(res.encode('utf-8'), addr)
if res.upper() == 'Q':
break udp_server.close() udp协议,client端代码: import socket
ip = input('输入服务端ip:')
port = input('输入端口:')
addr =(ip, int(port))
udp_client = socket.socket(type=socket.SOCK_DGRAM)
print('这里是客户端') while 1:
res = input('>>>').strip()
udp_client.sendto(res.encode('utf-8'), addr)
if res.upper() == 'Q':
break
back_msg = udp_client.recvfrom(1024)[0]
if back_msg.upper() == 'Q':
break
print(back_msg.decode('utf-8'), addr) udp_client.close() 例:时间同步服务器(伪)
udp server端: #!/usr/bin/env python
# _*_ coding: utf-8 _*_
# 时间同步服务 udp协议完成的
# N台机器
# 例如 00:00 从数据库里 读取一些数据 在一个机房里 有一台标准时间的服务器
# 机房里所有的机器 都每隔一段时间 就去请求这台服务器 来获取一个标准时间 import time
import socket
from socket import SOL_SOCKET, SO_REUSEADDR server = socket.socket(type=socket.SOCK_DGRAM)
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server.bind(('127.0.0.1', 9527)) while 1:
# 接收一个时间格式的消息
msg, addr = server.recvfrom(1024)
if not msg:
# 默认的时间格式
time_fmt = '%Y-%m-%d %X'
else:
time_fmt = msg.decode('utf-8')
# 服务端发送标准时间到客户端
server.sendto(time.strftime(time_fmt).encode('utf-8'), addr) server.close() udp client端: import time
import socket
ser =('127.0.0.1', 9527)
client = socket.socket(type=socket.SOCK_DGRAM)
client.sendto('%Y/%m/%d %H:%M:%S'.encode('utf-8'), ser)
ret, addr = client.recvfrom(1024)
print(ret.decode('utf-8'))
client.close()

end

铁乐学Python_Day33_网络编程Socket模块1的更多相关文章

  1. python 网络编程--socket模块/struct模块

    socket模块: 客户端:CS架构,  client -> server 浏览器:BS架构,  browser -> server 网络通信本质:传输字节 doc命令查看ip地址:ipc ...

  2. 网络编程---socket模块

    内容中代码都是先写  server端, 再写 client端 1 TCP和UDP对比 TCP(Transmission Control Protocol)可靠的.面向连接的协议(eg:打电话).传输效 ...

  3. Python的网络编程socket模块

    (1)利用socket进行简单的链接 Python里面的socket支持UDP.TCP.以及进程间的通信,socket可以把我们想要发送的东西封装起来,发送过去,然后反解成原来的样子,事实上网路通信可 ...

  4. 网络编程socket模块subprocess模块 粘包的解决

    什么是socket? tcp 可靠地面向连接协议 udp 不可靠的,无连接的服务,传送效率高

  5. 铁乐学python_Day39_多进程和multiprocess模块2

    铁乐学python_Day39_多进程和multiprocess模块2 锁 -- multiprocess.Lock (进程同步) 之前我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发 ...

  6. 铁乐学python_Day38_多进程和multiprocess模块1

    铁乐学python_Day38_多进程和multiprocess模块1 [进程] 运行中的程序就是一个进程. 所有的进程都是通过它的父进程来创建的. 因此,运行起来的python程序也是一个进程,那么 ...

  7. Python网络编程socket

    网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...

  8. 网络编程socket基本API详解(转)

    网络编程socket基本API详解   socket socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket ...

  9. Android 网络编程 Socket

    1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List< ...

随机推荐

  1. 玩转mongodb(五):mongodb 3.0+ 查询性能分析

    mongodb性能分析方法:explain() 为了演示的效果,我们先来创建一个有200万个文档的记录.(我自己的电脑耗了15分钟左右插入完成.如果你想插更多的文档也没问题,只要有耐心等就可以了.) ...

  2. 基于json-lib-2.2.2-jdk15.jar的JSON解析工具类大集合

    json解析之前的必备工作:导入json解析必须的六个包 资源链接:百度云:链接:https://pan.baidu.com/s/1dAEQQy 密码:1v1z 代码示例: package com.s ...

  3. Java 和 JSP 实现网站访问量统计 (刷新过滤)

    java 和 JSP 实现的统计网站访问量,不需要数据库,将数据存储在 指定位置的 txt 文件中,代码块分为两部分 首先, java 部分: import java.io.File; import ...

  4. The type org.springframework.jms.JmsException cannot be resolved报错解决

    在调用JmsTemplate的send方法时,一直报编译时异常.如下: 异常提示是无法解析org.SpringFrawork.jms.JmsException类型.如下: The type org.s ...

  5. 中国移动CMPP协议错误码

    中国移动CMPP协议错误码 状态码 说明                             出现次数高 DELIVRD 消息发送成功 用户成功接收到短信 REJECTD 消息因为某些原因被拒绝不 ...

  6. Emgucv(一)Aforge切换摄像头并调用摄像头属性

    一.新建一个Windows窗体应用程序,在Form1窗体上添加一个PictureBox控件.一个ComboBox控件,命名为PictureBox1.cbCapture,还有两个Button控件,Tex ...

  7. 【转】从msql数据库处理高并发商品超卖

    今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过:但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这方面的意识.今天就我的一些理解,整理一下 ...

  8. DUBBO监控,设置接口调用数据的上报周期

    目录 DUBBO监控,设置接口调用数据的上报周期 dubbo已有的监控方案 针对已有方案的改进 DUBBO监控,设置接口调用数据的上报周期 dubbo是目前比较好用的,用来实现soa架构的一个工具,d ...

  9. 深入理解MyBatis的原理(四):映射器的用法

    前言:继续深入学习 mybatis 的用法及原理,还是先会用再学习原理. 映射器的主要元素有:select.insert.update.delete.parameterMap(即将被删除,不建议使用) ...

  10. marquee 滚动到文字上时停止滚动,自定义停止方法

    我要实现的效果如下图:当鼠标移到续费提醒文字上时,文字滚动停止,并出现后面的关闭按钮:当鼠标移出文字时,文字继续滚动,后面的关闭按钮不显示. 在网上查到的marquee停止滚动的的代码是这样的: &l ...