Python学习笔记【第十三篇】:Python网络编程一S…

2018-07-23 05:41:28来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

 什么是?络

  网络能把双方或多方连在一起的工具,即把数据从一方传递到另一方进行数据传递。

  网络编程就是不同电脑上的软件能够进行数据传递。即进程间的通讯。

什么是TCP/IP协议

  协议就是大家一起遵守的约定。

  计算机都遵守的?络通信协议叫做 TCP/IP协议

OSI七层协议 

  互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层

什么是IP

  某个电脑在网络中的具体位置

  ?来在?络中标记?台电脑的?串数字,?如192.168.1.1;在本地 局域?上是惟?的。

什么是端口

   在计算机中端口就是某个程序的具体位置

   端?是通过端?号来标记的,端?号只有整数,范围是从0到65535

.什么是socket

   socket(简称 套接字 ) 是进程间通信的?种?式,它与其他进程间通信的? 个主要不同是: 它能实现不同主机间的进程间通信,我们?络上各种各样的服务?多都是基 于 Socket 来完成通信的

 socket层

 

  Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

  所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

 Socket套接字工作流程

 

  服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束

 

tcp三次握? -------建立连接

tcp四次挥?接-------断开连接

 

 

TCP十种状态

 

TCP通信的完整通讯过程,如下图:

 

 

基于socket服务端客户端代码

服务端代码

 1 # -*- coding: utf-8 -*-
 2 
 3 # 声明字符编码
 4 # coding:utf-8
 5 import socket
 6 
 7 # 创建服务端套接字
 8 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 9 # 这个配置是防止客户端直接关闭,服务器再次启动报错。(原因是TCP的四次挥手未完成。)
10 server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
11 # 绑定IP及端口
12 server.bind(('', 7777))
13 # 设置监听最多10个客户端
14 server.listen(10)
15 
16 
17 def socket_server():
18     while True:
19         # 等待客户端的连接,返回客户端套接字和客户端信息
20         client_socket, client_info = server.accept()
21         while True:
22             try:
23                 # 等待接收客户端发来的消息
24                 client_msg = client_socket.recv(1024)
25                 print("%s:%s" % (client_info, client_msg.decode('utf-8')))
26                 # 给客户端发消息
27                 client_socket.send("服务器收到了".encode("utf-8"))
28             except Exception as e:
29                 print("%s 未正常断开", client_info)
30                 print(e)
31                 break
32         # 关闭套接字
33         client_socket.close()
34     server.close()
35 
36 
37 if __name__ == "__main__":
38     socket_server()

客户端代码

 1 # -*- coding: utf-8 -*-
 2 
 3 # 声明字符编码
 4 # coding:utf-8
 5 
 6 import socket
 7 
 8 # 创建客户端socket 套接字
 9 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
10 
11 # 连接服务器
12 client.connect(('172.16.6.5', 7777))
13 
14 
15 def socket_client():
16     while True:
17         send_msg = input(">>")
18         # 向服务器发送消息
19         client.send(send_msg.encode("utf-8"))
20         # 等待服务器回消息
21         server_msg = client.recv(1024)
22         print("<< %s" % server_msg.decode('utf-8'))
23     # 关闭连接
24     client.close()
25 
26 
27 if __name__ == "__main__":
28     socket_client()

 

socket通讯基本方法总结

  服务端套接字函数
    s.bind() 绑定(主机,端口号)到套接字
    s.listen() 开始TCP监听
    s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来

  客户端套接字函数
    s.connect() 主动初始化TCP服务器连接
    s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

  公共用途的套接字函数
    s.recv() 接收TCP数据
    s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
    s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
    s.recvfrom() 接收UDP数据
    s.sendto() 发送UDP数据
    s.getpeername() 连接到当前套接字的远端的地址
    s.getsockname() 当前套接字的地址
    s.getsockopt() 返回指定套接字的参数
    s.setsockopt() 设置指定套接字的参数
    s.close() 关闭套接字

  面向锁的套接字方法
    s.setblocking() 设置套接字的阻塞与非阻塞模式
    s.settimeout() 设置阻塞套接字操作的超时时间
    s.gettimeout() 得到阻塞套接字操作的超时时间

  面向文件的套接字的函数
    s.fileno() 套接字的文件描述符
    s.makefile() 创建一个与该套接字相关的文件

 

什么是UDP?

  UDP是?种?向?连接的协议,每个数据报都是?个独?的信息,包括完整 的源地址或?的地址,它在?络上以任何可能的路径传往?的地,因此能否 到达?的地,到达?的地的时间以及内容的正确性都是不能被保证的。

  UDP通信时不需要建?连接,数据的传输?然是不可靠 的,UDP?般?于多点通信和实时的数据业务,?如 语??播 视频 QQ TFTP(简单?件传送) SNMP(简单?络管理协议) RIP(路由信息协议,如报告股票市场,航空信息)

  DNS(域名解释

  创建?个udp客户端程序的流程是简单,具体步骤如下:

UDP服务端

 1 # -*- coding: utf-8 -*-
 2 
 3 # 声明字符编码
 4 # coding:utf-8
 5 
 6 import socket
 7 
 8 
 9 def udp_server():
10     server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
11 
12     server.bind(('', 8888))
13     while True:
14         server_msg, client_info = server.recvfrom()
15 
16         print('%s << %s' % (client_info, server_msg.decode('utf-8')))
17         msg = input('>>')
18         server.sendto(msg.encode('utf-8'), client_info)
19 
20 
21 if __name__ == "__main__":
22     udp_server()

UDP客户端

 1 # -*- coding: utf-8 -*-
 2 
 3 # 声明字符编码
 4 # coding:utf-8
 5 
 6 import socket
 7 
 8 
 9 def udp_client():
10     client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
11     while True:
12         msg = input('>>')
13         client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8888))
14         server_msg, server_info = client.recvfrom()
15         print('%s << %s' % (server_info, server_msg.decode('utf-8')))
16 
17 
18 if __name__ == "__main__":
19     udp_client()

udp总结

  1. udp是TCP/IP协议族中的?种协议能够完成不 同机器上的程序间的数据通信

  2. udp服务器、客户端 udp的服务器和客户端的区分:

    往往是通过 请求服务 和 提供服务 来进? 区分 请求服务的??称为:客户端 提供服务的??称为:服务器

  3. udp绑定问题

    ?般情况下,服务器端,需要绑定端?,?的是为了让其他的客户端能 够正确发送到此进程 客户端,?般不需要绑定,?是让操作系统随机分配,这样就不会因为 需要绑定的端?被占??导致程序?法运?的情况

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:00x0 python字符串和变量

下一篇:使用git进行版本控制