目录
1.网络传输是以二进制数据进行传输的。

2.数据转化用到了encode和decode函数:
1.TCP网络应用程序开发分为客户端程序开发和服务端程序开发。
2.主动发起建立连接请求的是客户端程序。
3.等待接受连接请求的是服务端程序。

1.创建客户端套接字对象(买电话)
2.和服务端套接字建立连接(打电话)
3.发送数据(说话)
4.接收数据(接听)
5.关闭客户端套接字(挂电话)
import socket
if __name__ == '__main__':
# 1.创建客户端套接字对象(AF_INET表示IP地址类型是IPv4,SOCK_STREAM表示传输协议类型是TCP)
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.和服务端套接字建立连接
tcp_client_socket.connect(("192.168.56.1",8080))
# 3.发送数据
tcp_client_socket.send("nihaoma".encode(encoding="utf-8"))
# 4.接受数据(recv阻塞等待数据的到来)
recv_data = tcp_client_socket.recv(1024)
# decode函数的字符集默认是utf-8
print("客户端接收到的数据:",recv_data.decode())
# 5.关闭客户端套接字
tcp_client_socket.close()
客户端发送:
nihaoma
服务端接收:

服务端发送:

客户端接收:

1.创建服务端套接字对象
2.绑定IP地址和端口号
3.设置监听
4.等待接受客户端的连接请求
5.接收数据
6.发送数据
7.关闭套接字
import socket
if __name__ == '__main__':
# 1.创建服务端套接字对象
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用(程序退出时,端口号立即释放)
tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
# 2.绑定IP地址和端口号
# tcp_server_socket.bind(("192.168.43.163",8888))
# 如果bind中的参数第一个ip地址元素设置为"",默认为本机IP地址
tcp_server_socket.bind(("", 8888))
# 3.设置监听(128代表服务端等待排队连接的最大数量)
tcp_server_socket.listen(128)
# 4.等待接受客户端的连接请求(accept阻塞等待,返回一个和客户端通信的socket和客户端地址)
conn_socket, ip_port = tcp_server_socket.accept()
print("客户端地址:", ip_port)
# 5.接收数据
recv_data = conn_socket.recv(1024)
print("服务端接收到的数据:",recv_data.decode())
# 6.发送数据
conn_socket.send("nihao".encode())
# 7.关闭套接字
conn_socket.close()
tcp_server_socket.close()
客户端发送:

服务端接收:

服务端发送:
nihao
客户端接收:



不管是recv还是send都不是直接接收到对方的数据和发送数据到对方。
发送数据会写入到发送缓冲区,接收数据是从接收缓冲区来读取。
发送数据和接收数据最终是由操作系统控制网卡来完成。
开发一个多任务版TCP服务端程序,实现一个服务端同时服务多个客户端。
分析:多个需要用到循环,同时需要用到多线程。
import socket
import threading
def handle_client(conn_socket):
# 3.5接收数据
recv_data = conn_socket.recv(1024)
print("服务端接收到的数据:", recv_data.decode())
# 3.6发送数据
conn_socket.send("nihao".encode())
# 3.7关闭与客户端通信的套接字
conn_socket.close()
if __name__ == '__main__':
# 1.创建服务端套接字对象
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用
tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
# 2.绑定IP地址和端口号
# tcp_server_socket.bind(("192.168.43.163",8888))
# 如果bind中的参数第一个ip地址元素设置为"",默认为本机IP地址
tcp_server_socket.bind(("", 8888))
# 3.循环接收客户端的连接请求
while True:
# 3.1设置监听(128代表服务端等待排队连接的最大数量)
tcp_server_socket.listen(128)
# 3.2等待接受客户端的连接请求(accept阻塞等待,返回一个和客户端通信的socket和客户端地址)
conn_socket, ip_port = tcp_server_socket.accept()
print("客户端地址:", ip_port)
# 3.3创建多线程用来同时接收多个客户端的请求
sub_thread = threading.Thread(target=handle_client,args=(conn_socket,))
# 3.4启动线程执行任务
sub_thread.start()
# 4.关闭服务端套接字
tcp_server_socket.close()
服务端:

客户端1:

客户端2:

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p