详解python的⽹络编程基础
⽬录
⼀.什么是⽹络编程
⼆.socket
1.socket的基本语法
2.与socket有关的⼀些函数
服务端函数
客户端函数
公共函数
三.程序需求
服务端分析
客户端分析
四.代码升级
加上通信循环
加上连接循环以及完善
总结
⼀.什么是⽹络编程
⽹络编程涉及到⼀些计算机基础知识,还跟你的电脑系统有关,mac os/Linux和windows是不同的,由于我⽤的是windows,所以以下所有都是windows操作系统的适⽤的,并且⾥⾯的字符编码windows和mac os也是不同的,这⾥我们实现的只是简单的服务端发送什么,客户端就接收到什么,之后还会有模拟ssh的远程命令还有粘包问题,最后也可以实现⽂件的下载。
⽹络编程还涉及到重要的⼀部分理论知识包括什么是⽹络还有⽐较重要的五层协议,以我的理解,这些东西就是专业的告诉你,在你的电脑上假设要接收⼀些⽂件,这些东西是怎么传输过来的,你的电脑⼜是怎么接收的,所以这⾥⽆⾮就是你的电脑即客户端和传输⽂件的⼀⽅即服务点进⾏的⼀个交互,
这些我都建议你去听⼀下(我感觉以个⼈能⼒讲这些会有点⽔平不⾜)但是⼤的⽅⾯都离不开⼀种交互。
⼆.socket
众所周知,python功能的强⼤很⼤⼀⽅⾯就在于它有强⼤的第三⽅外部库,socket这个库⼜叫套接字,专业解释就是应⽤程序通常通过"套接字"向⽹络发出请求或者应答⽹络请求,使主机间或者⼀台计算机上的进程间可以通讯,进⽽通过socket这个库就可以实现我在前⾯所说的客户端和服务端的交互。
1.socket的基本语法
socket(family,type,[protocol])
其中的family有三种
socket.AF_UNIX 只能够⽤于单⼀的Unix系统进程间通信
socket.AF_INET 服务器之间⽹络通信
socket.AF_INET6 IPv6
type也有三种
socket.SOCK_STREAM 流式socket , 当使⽤TCP时选择此参数
socket.SOCK_DGRAM数据报式socket ,当使⽤UDP时选择此参数
socket.SOCK_RAW 原始套接字,普通的套接字⽆法处理ICMP、IGMP等⽹络报⽂,⽽SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报⽂;此外,利⽤原始套接字,可以通过IP_HDRINCL套接字选项由⽤户构造IP头。
⽽protocol 指明所要接收的协议类型,通常为0或者不填,基本上是不写的
2.与socket有关的⼀些函数
服务端函数
address⼀般指你的电脑上的ip地址,即你打开Windows的命令提⽰符,你联⽹之后输⼊ipconfig命令,⾥⾯的IPV4
表格样式为中度样式4s.bind(address)将套接字绑定到地址,即在客户端中,你要把你的程序绑定⼀个ip和端⼝才能实现交互
s.listen(backlog)操作系统可以挂起的最⼤连接数量。即你的服务端最多能把数据传给⼏个客户端
s.accept()接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以⽤来接收和发送数据。address是连接客户端的地址。
客户端函数
公共函数
s.send(string)
发送TCP数据。将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能⼩于string的字节⼤⼩。
s.sendall(string)
完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功
返回None,失败则抛出异常。
接受UDP套接字的数据。与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
s.sendto(string,address)
发送UDP数据。将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。s.close()
关闭套接字。
三.程序需求
既然是实现⼀种交互,那么⽣活中打电话和接收电话也可以理解为⼀种交互,打电话就可以理解为发送数据,收电话就可以理解为接收数据,这样就有了服务端和客户端,这⾥我们以这样⼀种场景实现交互。
服务端分析
如果你要发送数据⾸先你得有⼀个⼿机然后引⼊socket进⾏交互,然后你要进⾏⼀系列的绑定操作即你需要上⾯的函数来实现,⾸先你在客户端模拟⼀个⼿机引⼊socket之后,你需要进⾏绑定,开机,等待电话链接,收发消息,挂电话等功能
注意:
1.在绑定操作过程中,你需要联⽹之后输⼊你本机的ip地址,即你打开命令提⽰符你输⼊ipconifg命令的IPV4地址
2.在绑定你的地址后后⾯会加⼀个端⼝号,这个端⼝号是任意的,不过有时候会被占⽤,被占⽤则更改以下就好
3.在⼿法消息中还有⼀个upper函数,是将客户端发送过来的数据以⼤写的形式在发送给客户端
4.在客户端⽤accept是接受TCP连接并返回(conn,address)
--------------------------------服务端----------------------delete语句执行后如何提交
import socket
#1.买⼿机
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# print(phone) #测试你的⼿机
#2.插卡绑定⼿机卡
phone.bind(("192.168.2.18",3234))
#3.开机
phone.listen(5) #5代表最⼤挂起的连接数
#4.等电话链接
print("starting")
conn,client_add = phone.accept()
# 5.收发消息
v(1024) #1024代表接收数据的最⼤数,单位是bits
print("客户端数据",data)
conn.send(data.upper())
#6.挂电话
conn.close()
#7.关机
phone.close()
客户端分析
服务端分析完,客户端和服务端是⼀⼀对应的,在收发消息这⾥,客户端给服务端发送⼀个⼩写的hello,服务端就⼜会给客户端回⼀个⼤写的HELLO
-------------------------------客户端-----------------------------
import socket
#1.买⼿机
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# print(phone)
#2.拨号
#3.发收消息
phone.send("hells".encode("utf"))
v(1024)
print(data)
phone.close()
四.代码升级
加上通信循环
上⾯的代码我们可以看出,我们实现的太简单了,我们只是固定的让它收发消息,我们如何让这个程序在客户端和服务端之间循环并且收发你想要的东西呢,这是我们加⼊输⼊和循环就可以
----------------------------服务端------------------------
translate的用法import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# print(phone)
phone.bind(("172.20.10.4",3234))
phone.listen(5) print("starting")
conn,client_add = phone.accept()
print(client_add)
while True:
v(1024)
print("客户端数据",data)
conn.send(data.upper())
conn.close()
phone.close()
----------------------------------客户端------------------------
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# print(phone)
msg = input(">>>:").strip()
phone.de("utf-8"))
v(1024)
print(data)
phone.close()
⼤家可以看到,我们只是在客户端⾥⾯加⼊了循环输⼊功能如何在服务端⾥加⼊循环,这样就可以实现⼀种循环输⼊
加上连接循环以及完善
我们以上的程序都是⼀个客户端对应⼀个服务端,但是真正应该服务端可以对应多个客户端收发数据。我们主要修改的是服务端代码,客户端代码应该是变化不⼤的,除了客户端应该加⼀个判断是否有数据发送。
1.我们没有学习并发编程,所以我们的代码⽤循环来实现即你的服务端接受完⼀个客户端的数据以后,你可以继续去接收另⼀个客户端的数据
2.除此之外我们还加上了⼀⾏代码⽤于判断你的端⼝是否被占⽤这样就可以减少出错
3.我在加上⼀个客户端之后我们会出现另外⼀个问题就是我们到底需不需要另⼀个客户端传输的数据或者说我们的多个客户端到底有没有都发送数据,所以我们这⾥需要⼀个try和except先去判断⼀下
--------------------------------服务端-----------------------
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #判断接⼝是否被占⽤
phone.bind(("172.20.10.4",3234))
phone.listen(5)
print("starting")
while True: #没有学习并发编程没办法执⾏代码后返回到这继续执⾏,所以⽤循环解决
conn,client_add = phone.accept()
print(client_add)
while True:
try:
v(1024)
if not data:break
print("客户端数据",data)
conn.send(data.upper())
except ConnectionResetError :
break
conn.close()
phone.close()
-----------------客户端1-----------------
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
while True:
msg = input(">>>:").strip()
if not msg: continue #若输⼊空则继续循环
基于llvm的编程语言phone.de("utf-8"))
# print("if send none")
v(1024)
print(data)
# print(data.decode("utf-8"))编程教学书
phone.close()
-----------------------------客户端2---------------------
学python编程入门import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
while True:
msg = input(">>>:").strip()
if not msg: continue #若输⼊空则继续循环
phone.de("utf-8"))
# print("if send none")
v(1024)
# print(data.decode("utf-8"))
phone.close()
总结
本篇⽂章就到这⾥了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论