CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准。C系列认证历经近一年的实际线下调研、考察、迭代、测试,并梳理出软件工程师开发过程中所需的各项技术技能,结合企业招聘需求和人才应聘痛点,基于公开、透明、公正的原则,甑别人才时确保真实业务场景、全部上机实操、所有过程留痕、存档不可篡改。

我们每天将都会精选CSDN站内技术文章供大家学习,帮助大家系统化学习IT技术。

Win10

python - 3.5

 

Socket工作原理和基本概念

Socket的中文翻译是套接字,它是TCP/IP网络环境下应用程序与底层通信驱动程序之间运行的开发接口,它可以将应用程序与具体的TCP/IP隔离开来,使得应用程序不需要了解TCP/IP的具体细节,就能够实现数据传输。

在网络应用程序中,Socket通信是基于客户端/服务器结构。客户端是发送数据的一方。服务器时刻准备接受来自客户端的数据,对做出响应

实现基于tcp网络通信与现实中打电话很像:

1)      客户端(相当于打电话的一方),需要了解服务器的ip地址,如果该服务器有多个网络应用程序,单单ip地址则不够,这时候socket通信借用tcp/ip中端口的概念,不同应用程序使用不同端口通信(这就很类似电话分机)。

2)      服务器应用程序必须早于客户端启动,并在指定ip地址和端口上执行监听,端口被占用,服务器则无法正常启动。(服务器处于监听状态就类似电话接通好电话线,等待被拨打的状态)

3)      客户端在申请发送数据时,服务器端应用程序必须有足够的时间响应才能进行正常通信(电话响,却无人接听)。通常情况下,服务器的应用程序都需要具备同时处理多个客户端请求的能力,应用程序设计不合理或访问量过高都会导致响应超时。

4)      使用Socket协议进行通信的双方必须使用相同的通信协议,Socket支持的底层通信协议包括tcp和udp两种,通信过程中,双方还必须采用相同的字符编码,按照约定的方式进行通信(打电话时,双方必须语言相同,才能进行信息交流)

5)      通信时,物理网络必须保持通畅,否则通信将会中断(电话线有效,且连接正常)。

6)      通信结束之前,客户端和服务器端都可以中断连接(任何一方都可以挂电话)。

TCP是基于连接的通信协议,即先建立稳定连接后,再数据传输

如果Socket通信基于UDP,则数据传输前不需要连接,类似发短信或发电报,即使对方不在线,也可以发送数据,发送的数据在指定时间没有得到对方响应,则视为操作超时,可以选择超时后重新发送数据。

Socket编程的层次结构

应用层

Socket开发接口

传输层

TCP

UDP

网络层

IP

驱动

物理层

基于TCP的Socket编程

面向连接的Socket通信是基于TCP的

服务器程序要先与客户机程序启动,步骤以及调用函数:

1)      调用socket()函数创建一个流式套接字,返回套接字号s

2)      调用bind()将s绑定到已知地址,通常为本地ip

3)      调用listen()将s设为监听模式,准备接收来自各客户端的连接请求

4)      调用accept()等待接受客户端连接请求

5)      如果接收到客户端请求,则accept()返回,得到新的套接字ns

6)      调用rev()接收来自客户端的数据,调用send()向客户端发送数据

7)      与客户端通信结束,服务器端可以调用shutdown()对方不再接收和发送数据,也可以由客户端程序断开连接,断开连接后,服务器进程调用closesocket()关闭套接字ns,此后服务器返回第四步

8)      如果要退出服务器程序,则调用closesocket()关闭最初的套接字s

客户端程序步骤以及调用函数:

1)      调用WSAStartup()函数加载Windows Sockets动态库,然后调用socket()函数创建一个流式套接字,返回套接字号s。

2)      调用connect()函数将套接字s连接到服务器。

3)      调用send()函数向服务器发送数据,调用recv()函数接收来自服务器的数据。

4)      与服务器的通信结束后,客户端程序可以调用close()函数关闭套接字。

相关函数:

1.socket()函数

socket()函数用于创建与指定的服务提供者绑定套接字,函数原型如下:

socket=socket.socket(familly,type)

参数说明如下:

familly,指定协议的地址家族,可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信。

type,指定套接字的类型。

套接字类型

说    明

SOCK_STREAM

提供顺序、可靠、双向和面向连接的字节流数据传输机制,使用TCP

SOCK_DGRAM

支持无连接的数据报,使用UDP

SOCK_RAW

原始套接字,可以用于接收本机网卡上的数据帧或者数据包

2.bind()函数

bind()函数可以将本地地址与一个Socket绑定在一起,函数原型如下:

socket.bind( address )

参数address是一个双元素元组,格式是(host,port)。host代表主机,port代表端口号。

3.listen()函数

listen()函数可以将套接字设置为监听接入连接的状态,函数原型如下:

listen(backlog);

参数backlog指定等待连接队列的最大长度。

4.accept()函数

在服务器端调用listen()函数监听接入连接后,可以调用accept()函数来等待接受连接请求。accept()的函数原型如下:

connection, address = socket.accept()

调用accept()方法后,socket会进入waiting状态。客户请求连接时,accept()方法会建立连接并返回服务器。accept()方法返回一个含有两个元素的元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素 address是客户的Internet地址。

5.recv()函数

调用recv()函数可以从已连接的Socket中接收数据。recv()的函数原型如下:

buf = sock.recv(size)

参数sock是接收数据的socket对象,参数size指定接收数据的缓冲区的大小。recv()的函数的返回接收的数据。

6.send()函数

调用send()函数可以在已连接的Socket上发送数据。send()的函数原型如下:

sock.recv(buf)

参数sock是在已连接的Socket上发送数据。参数buf是也要已连接的Socket上发送数据。

7.close()函数

close ()函数用于关闭一个Socket,释放其所占用的所有资源。socket()的函数原型如下:

s.closesocket();

参数s表示要关闭的Socket。

使用socket通讯的简易服务器
        connection.close()

import socket

if __name__ == "__main__":
    #创建socket对象s,基于internet地址和tcp协议
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #绑定到本地的8001端口
    s.bind(("localhost",8001))
    #在本地8001端口监听,等待连接队列最大长度为5
    s.listen(5)
    print("等待连接")
    while True:
        #接收来自客户端的连接
        connection,address = s.accept()
        try:
            connection.settimeout(5)
            buf = connection.recv(1024).decode('utf-8')#接收客户端消息
            if buf=='1':
                connection.send(b'welcome to server')
            else:
                connection.send(b'please go out')
        except s.timeout:
            print('time out')
        connection.close()

使用socket进行通信的建议客户端

import socket

import time
if __name__ == '__main__':
    s =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect(('localhost',8001))
    #推迟执行
    time.sleep(2)
    s.send(b'1')
    print(s.recv(1024).decode('utf-8'))
    s.close()

基于TCP的Socket编程

面向连接的Socket通信是基于TCP的

由流程可以看出面向非连接的Socket通信流程比较简单,在服务器上不需要listen()和accept()来等待客户端连接,客户端程序不需要雨服务器建立连接,而是直接向服务器发送数据。

1.     sendto()函数

使用sendto()函数可以实现发送数据的功能,函数原型如下;

s.sendto(data,(addr,port))

参数说明如下:

  s,指定一个Socket句柄。

  data,要传输数据。

  addr,接收数据的计算机的IP地址。

  port,接收数据的计算机的端口。

示例:import socket
#创建UDP SOCKET
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
port = 8000 #服务器端口
host = '192.168.0.101'#服务器地址
while True:msg = input()# 接受用户输入if not msg:break# 发送数据s.sendto(msg.encode(),(host,port))
s.close()

2.     recvfrom()函数

使用recvfrom ()函数可以实现接收数据的功能,函数原型如下;

data,addr = s.recvfrom( bufsize);

参数说明如下:

  s,指定一个Socket句柄。

  bufsize,接收数据的缓冲区的长度,单位为字节。

  data,接收数据的缓冲区。

  addr,发送数据的客户端的地址。

示例:

import socket

#创建基于UDP的socket对象用socket.SOCK_DGRAM
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('localhost',8000))

#循环调用recvfrom()接收客户端发送来的数据

while True:

data,addr = s.recvfrom(1024)
    if not data:
        print('client has exited!')
        break
   
print('received:',data,'from',addr)
s.close()

关于CSDN软件工程师能力认证

CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准。C系列认证历经近一年的实际线下调研、考察、迭代、测试,并梳理出软件工程师开发过程中所需的各项技术技能,结合企业招聘需求和人才应聘痛点,基于公开、透明、公正的原则,甑别人才时确保真实业务场景、全部上机实操、所有过程留痕、存档不可篡改。C系列认证的宗旨是让一流的技术人才凭真才实学进大厂拿高薪,同时为企业节约大量招聘与培养成本,使命是提升高校大学生的技术能力,为行业提供人才储备,为国家数字化战略贡献力量。

了解详情可点击:CSDN软件工程师能力认证介绍

本文出处:https://blog.csdn.net/holmehai/article/details/80299102?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161424049616780255255048%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161424049616780255255048&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-7-80299102.pc_search_result_before_js&utm_term=python+网络编程&spm=1018.2226.3001.4187

 

【CSDN软件工程师能力认证学习精选】Python网络编程(socket编程)相关推荐

  1. 【CSDN软件工程师能力认证学习精选】吐血整理!140 种 Python 标准库、第三方库和外部工具都有了

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...

  2. 【CSDN软件工程师能力认证学习精选】Python可视化库

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...

  3. 【CSDN软件工程师能力认证学习精选】不用框架,python实现卷积神经网络

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...

  4. 【CSDN软件工程师能力认证学习精选】如何入门Python与机器学习

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...

  5. 【CSDN软件工程师能力认证学习精选】机器学习之决策树(Decision Tree)及其Python代码实现

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...

  6. 【CSDN软件工程师能力认证学习精选】python | 史上最全的正则表达式

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...

  7. 【CSDN软件工程师能力认证学习精选】python数据统计分析

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...

  8. 【CSDN软件工程师能力认证学习精选】 常见的主流数据库(DBMS)

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...

  9. #CSDN软件工程师能力认证学习精选# Hadoop基础知识学习

    CSDN软件工程师能力认证是由CSDN制定并推出的一个能力认证标准,宗旨是让一流的技术人才凭真才实学进大厂拿高薪,同时为企业节约大量招聘与培养成本,使命是提升高校大学生的技术能力,为行业提供人才储备, ...

最新文章

  1. Android 哥哥福利
  2. 用于文本识别的合成数据生成器
  3. 2019ICPC(南京) - Greedy Sequence(线段树)
  4. 深入浅出linux工具与编程 下载,8208.深入浅出Linux工具与编程.pdf
  5. java错误1601解决方法,求助解决错误
  6. 【华为云技术分享】程序员实用JDK小工具归纳
  7. 【转载】SpringMVC访问静态资源
  8. C语言课程设计——工资管理系统
  9. Mac 新手必看:认识 Mac 桌面
  10. Linux下设置MTU值到9000
  11. Python爬虫 | 以滑雪为例演示大众点评商铺信息采集!
  12. 《数学建模简明教程--基于python》学习笔记-第四章-微分方程-课后习题解答
  13. mac设置端口号转发到默认端口80、443
  14. RabbitMQ安装rabbitmq_delayed_message_exchange插件(死信队列所需插件)
  15. Oxford Nanopore MinION Sequencing and Genome Assembly
  16. matlab snr mse,MATLAB 均方根误差MSE、两图像的信噪比SNR、峰值信噪比PSNR、结构相似性SSIM...
  17. 小红书投放效果差?3招教你优化Brief直击用户需求
  18. bzoj3252攻略 贪心+dfs序+线段树
  19. flash 频谱 转html,Flash制作音乐频谱
  20. 小米4c怎么添加语言怎么设置在哪,小米路由器4C手机怎么设置?

热门文章

  1. 歌德巴赫猜想。任何一个偶数都可以分解为两个素数之和。(其实这是个C二级考试的模拟试题)...
  2. java 使用adobe fms流媒体
  3. Vue常用经典开源项目汇总参考-海量
  4. 干货 I 用数据分析进行“无死角”的复盘?
  5. educoder算法设计与分析 实验一扩展 袋鼠过河问题
  6. 冷门又实用的Excel技巧知识,还不来看看嘛
  7. Linux用户获得超级管理员权限
  8. 传奇黑客成『吹哨人』,推特麻烦了;谷歌20+技术学习路线;Python数据科学电子书;游戏智能体开发平台;前沿论文 | ShowMeAI资讯日报
  9. Nvidia Support Matrix 支持矩阵
  10. 规则引擎系列—初识规则引擎