详解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

s.bind(address)将套接字绑定到地址,即在客户端中,你要把你的程序绑定一个ip和端口才能实现交互

s.listen(backlog)操作系统可以挂起的最大连接数量。即你的服务端最多能把数据传给几个客户端

s.accept()接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。

客户端函数

s.connect(address)连接到客户端address处的套接字

s.recv(bufsize)接受TCP套接字的数据。数据以字符串形式返回,bufsize指定要接收的最大数据量。

公共函数

s.send(string)

发送TCP数据。将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。

s.sendall(string)

完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。

s.recvfrom(bufsize)

接受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)

--------------------------------服务端----------------------
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.收发消息
data=conn.recv(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.拨号
phone.connect(("192.168.2.18",3234))

#3.发收消息

phone.send("hells".encode("utf"))
data=phone.recv(1024)
print(data)

phone.close()

四.代码升级

加上通信循环

上面的代码我们可以看出,我们实现的太简单了,我们只是固定的让它收发消息,我们如何让这个程序在客户端和服务端之间循环并且收发你想要的东西呢,这是我们加入输入和循环就可以

----------------------------服务端------------------------
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:
    data=conn.recv(1024)
    print("客户端数据",data)

    conn.send(data.upper())

conn.close()
phone.close()
----------------------------------客户端------------------------
import socket

phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# print(phone)
phone.connect(("172.20.10.4",3234))

while True:
    msg = input(">>>:").strip()
    phone.send(msg.encode("utf-8"))
    data=phone.recv(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:
            data=conn.recv(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)
phone.connect(("172.20.10.4",3234))

while True:
    msg = input(">>>:").strip()
    if not msg: continue          #若输入空则继续循环
    phone.send(msg.encode("utf-8"))
    # print("if send none")
    data=phone.recv(1024)
    print(data)
    # print(data.decode("utf-8"))

phone.close()
-----------------------------客户端2---------------------
import socket

phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(("172.20.10.4",3234))

while True:
    msg = input(">>>:").strip()
    if not msg: continue          #若输入空则继续循环
    phone.send(msg.encode("utf-8"))
    # print("if send none")
    data=phone.recv(1024)
    print(data)
    # print(data.decode("utf-8"))

phone.close()

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Python网络编程详解

    1.服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的"服务".它存在唯一目的就是等待客户端的请求,并响应它们(提供服务),然后等待更多请求. 2.客户端/服务器架构既可以应用于计算机硬件,也可以应用于计算机软件. 3.在服务器响应客户端之前,首先会创建一个通信节点,它能够使服务器监听请求. 一.套接字:通信端点 1.套接字 套接字是计算机网络数据结构,它体现了上节中所描述的"通信端点"的概念.在任何类型的通信开始之前,网络应用程序必须创建套接字

  • 详解Python Socket网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ 聊天.收发 email 等等.要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,就有了通信的基础了. 本文主要介绍使用Python 进行TCP Socket 网络编程,假设你已经具

  • python网络编程实例简析

    本文实例讲述了python网络编程,分享给大家供大家参考. 具体方法如下: 服务端代码如下: from SocketServer import(TCPServer as TCP, StreamRequestHandler as SRH) from time import ctime HOST = '' PORT = 21567 ADDR = (HOST, PORT) class MyRequestHandle(SRH): def handle(self): print 'connecting f

  • python网络编程学习笔记(一)

    学习用书:<python 网络编程基础>作者John Goerzen 第一部分底层网络学习 Python提供了访问底层操作系统Socket接口的全部方法,需要的时候这些接口可以提供灵活而强有力的功能. (1)基本客户端操作 在<python 网络编程基础>一书中,作者列出了一个简单的Python客户端程序,具体如下: 复制代码 代码如下: import socket,sysport =70host=sys.argv[1] filename=sys.argv[2] s=socket.

  • python 网络编程要点总结

    目录 1,七层网络协议 2,TCP/UDP 3,例子 4,粘包 1,七层网络协议 应表会传网数物: 应用层.表示层.会话层: (这三层又可以合并为应用层,这样就是五层网络协议[osi五层协议]) python '你好'.encoding('utf-8') 传输层: 预备如何传输.使用的端口 (port,tcp,udp): 四层路由器.四层交换机 网络层: ip(ipv4 ipv6): 路由器.三层交换机 数据链路层: mac(mac, arp协议:可以通过ip找到mac): 二层交换机.网卡(单

  • 详解python的网络编程基础

    目录 一.什么是网络编程 二.socket 1.socket的基本语法 2.与socket有关的一些函数 服务端函数 客户端函数 公共函数 三.程序需求 服务端分析 客户端分析 四.代码升级 加上通信循环 加上连接循环以及完善 总结 一.什么是网络编程 网络编程涉及到一些计算机基础知识,还跟你的电脑系统有关,mac os/Linux和windows是不同的,由于我用的是windows,所以以下所有都是windows操作系统的适用的,并且里面的字符编码windows和mac os也是不同的,这里我

  • 详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)

    思维导图: 效果(语句版): 源码: # -*- coding: utf-8 -*- """ Created on Tue Mar 5 17:59:29 2019 @author: dell """ # ============================================================================= # 步骤: # 分割aaa = jieba.cut(str,cut_all=True/Fa

  • 详解python之异步编程

    目录 一.异步编程概述 二.python的异步框架模型 三.顺序执行多个可重叠的任务 四.异步化同步代码 五.使用多线程克服具体任务的异步限制 总结 一.异步编程概述 异步编程是一种并发编程的模式,其关注点是通过调度不同任务之间的执行和等待时间,通过减少处理器的闲置时间来达到减少整个程序的执行时间:异步编程跟同步编程模型最大的不同就是其任务的切换,当遇到一个需要等待长时间执行的任务的时候,我们可以切换到其他的任务执行: 与多线程和多进程编程模型相比,异步编程只是在同一个线程之内的的任务调度,无法

  • 详解python tcp编程

    网络连接与通信是我们学习任何编程语言都绕不过的知识点. Python 也不例外,本文就介绍因特网的核心协议 TCP ,以及如何用 Python 实现 TCP 的连接与通信. TCP 协议 TCP协议(Transmission Control Protocol, 传输控制协议)是一种面向连接的传输层通信协议,它能提供高可靠性通信,像 HTTP/HTTPS 等网络服务都采用 TCP 协议通讯.那么网络通讯方面都会涉及到 socket 编程,当然也包括 TCP 协议. Network Socket 我

  • 详解python UDP 编程

    前面我们讲了 TCP 编程,我们知道 TCP 可以建立可靠连接,并且通信双方都可以以流的形式发送数据.本文我们再来介绍另一个常用的协议–UDP.相对TCP,UDP则是面向无连接的协议. UDP 协议 我们来看 UDP 的定义: UDP 协议(User Datagram Protocol),中文名是用户数据报协议,是 OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务. 从这个定义中,我们可以总结

  • 详解python网络进程

    目录 一.多任务编程 二.进程 三.os.fork创建进程 3.1.进程ID和退出函数 四.孤儿和僵尸 4.1.孤儿进程 4.2.僵尸进程 4.3.如何避免僵尸进程的产生 五.Multiprocessing创建进程 5.1.multiprocessing进程属性 六.进程池 七.进程间通信(IPC) 7.1.管道通信(Pipe) 7.2.消息队列 7.3.共享内存 7.4.信号量(信号灯集) 一.多任务编程 意义:充分利用计算机的资源提高程序的运行效率 定义:通过应用程序利用计算机多个核心,达到

  • 详解Python IO编程

    文件读写 读文件 try: # windows下utf8 f = open('./README.md', 'r', encoding='utf8', errors='ignore') print(f.read()) finally: f and f.close() # 用with简化 with open('./README.md', 'r', encoding='utf8') as f: print(f.read()) # 迭代读取大文件 with open('./README.md', 'r'

  • 详解Python模块化编程与装饰器

    我们首先以一个例子来介绍模块化编程的应用场景,有这样一个名为requirements.py的python3文件,其中两个函数的作用是分别以不同的顺序来打印一个字符串: # requirements.py def example1(): a = 'hello world!' print (a) print (a[::-1]) def example2(): b = 'hello again!' print (b) print (b[::-1]) if __name__ == '__main__':

  • 详解python编程slice与indices函数用法示例

    一般来说,内置的slice()函数会创建一个切片对象,可以用在任何允许进行切片操作的地方. 下面是slice的简介: # slice 两种用法 class slice(stop) class slice(start, stop[, step]) 返回一个表示由 range(start, stop, step) 所指定索引集的 slice对象. 其中 start 和 step 参数默认为 None. 切片对象具有仅会返回对应参数值(或其默认值)的只读数据属性 start, stop 和 step.

随机推荐