当前位置:天才代写 > tutorial > Python教程 > Python处事器开拓 — 网络基本

Python处事器开拓 — 网络基本

2017-11-02 08:00 星期四 所属: Python教程 浏览:53

网络由下往上分为物理层、数据链路层、网络层、传输层、会话层、暗示层和应用层。

HTTP是高层协议,而TCP/IP是个协议集,包过很多的子协议。包罗:传输层的 FTP,UDP,TCP协议等,网络层的ip协议等,高层协议如HTTP,telnet协议等,HTTP是TCP/IP的一个子协议。

socket是对TCP/IP协议的封装和应用(措施员层面上)。也可以说,TPC/IP协议是传输层协议,主要办理数据如安在网络中传输,而HTTP是应用层协议,主要办理如何包装数据。

我们在传输数据时,可以只利用(传输层)TCP/IP协议,可是那样的话,假如没有应用层,便无法识别数据内容,假如想要使传输的数据有意义,则必需利用到应用层协议,应用层协议有许多,好比HTTP、FTP、TELNET等,也可以本身界说应用层协议。WEB利用HTTP协议作应用层协议,以封装HTTP文本信息,然后利用TCP/IP做传输层协议将它发到网络上。

而我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket自己并不是协议,而是一个挪用接口(API),通过Socket,我们才气利用TCP/IP协议。实际上,Socket跟TCP/IP协议没有一定的接洽。Socket编程接口在设计的时候,就但愿也能适应其他的网络协议。所以说,Socket的呈现只是使得措施员更利便地利用TCP/IP协议栈罢了,是对TCP/IP协议的抽象,从而形成了我们知道的一些最根基的函数接口,好比create、listen、connect、accept、send、read和write等等。

TCP/IP只是一个协议栈,就像操纵系统的运行机制一样,必需要详细实现,同时还要提供对外的操纵接口。这个就像操纵系统会提供尺度的编程接口,好比win32编程接口一样,TCP/IP也要提供可供措施员做网络开拓所用的接口,这就是Socket编程接口。

有个较量形象的描写:HTTP是轿车,提供了封装可能显示数据的详细形式;Socket是动员机,提供了网络通信的本领。

实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket自己不算是协议,就像上面所说,它只是提供了一个针对TCP可能UDP编程的接口。

操作Socket成立网络毗连的步调:

成立Socket毗连至少需要一对套接字,个中一个运行于客户端,称为ClientSocket ,另一个运行于处事器端,称为ServerSocket 。

套接字之间的毗连进程分为三个步调:处事器监听,客户端请求,毗连确认。

1。处事器监听:处事器端套接字并不定位详细的客户端套接字,而是处于期待毗连的状态,及时监控网络状态,期待客户端的毗连请求。

2。客户端请求:指客户端的套接字提出毗连请求,要毗连的方针是处事器端的套接字。为此,客户端的套接字必需首先描写它要毗连的处事器的套接字,指出处事器端套接字的地点和端标语,然后就向处事器端套接字提出毗连请求。

3。毗连确认:当处事器端套接字监听到可能说吸收到客户端套接字的毗连请求时,就响应客户端套接字的请求,成立一个新的线程,把处事器端套接字的描写发给客户端,一旦客户端确认了此描写,两边就正式成立毗连。而处事器端套接字继承处于监听状态,继承吸收其他客户端套接字的毗连请求。

HTTP链接的特点

HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基本,也是手机联网常用的协议之一,HTTP协议是成立在TCP协议之上的一种应用。

HTTP毗连最显著的特点是客户端发送的每次请求都需要处事器回送响应,在请求竣事后,会主动释放毗连。从成立毗连到封锁毗连的进程称为“一次毗连”。

The Internet Protocol(协议)

IP就是一个32位无标记整数。IP地点通过DNS (Domain Name System) 数据库映射到域名

#!/usr/bin/env python
# Foundations of Python Network Programming - Chapter 1 - getname.py
import socket
hostname = 'google.com'
addr = socket.gethostbyname(hostname)
print 'The address of', hostname, 'is', addr
# The address of google.com is 173.194.72.113

Python网络编程:

Python提供了会见底层操纵系统Socket接口的全部要领,还提供了一组加密和认证通信的处事,SSL/TLS。

Sockets其实是一个文件描写符,差异于差异于当地文件,它毗连了网络上的一个文件。

1、建设一个UDP 当地毗连:

#!/usr/bin/env python
import socket, sys
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
MAX = 65535
PORT = 1060
if sys.argv[1:] == ['server']:
    s.bind(('127.0.0.1', PORT))
    print 'Listening at', s.getsockname()
    while True:
        data, address = s.recvfrom(MAX)
        print 'The client at', address, 'says', repr(data)              
     s.sendto('Your data was %d bytes' % len(data), address)
elif sys.argv[1:] == ['client']:
        print 'Address before sending:', s.getsockname()
        s.sendto('This is my message', ('127.0.0.1', PORT))
        print 'Address after sending', s.getsockname()
        data, address = s.recvfrom(MAX) # overly promiscuous - see text!
        print 'The server', address, 'says', repr(data)
else:
    print >>sys.stderr, 'usage: udp_local.py server|client'

#p#分页标题#e#

运行这段代码:

python filename.py server
#Listening at ('127.0.0.1', 1060)
#Address before sending: ('0.0.0.0', 0)
#Address after sending ('0.0.0.0', 62892)
#The server ('127.0.0.1', 1060) says 'Your data was 18 bytes'
python filename.py client
#The client at ('127.0.0.1', 62892) says 'This is my message'

2、建设长途毗连并验证收到的信息:

import random, socket, sys
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
MAX = 65535
PORT = 1060
if 2 <= len(sys.argv) <= 3 and sys.argv[1] == 'server':
    interface = sys.argv[2] if len(sys.argv) > 2 else ''
    s.bind((interface, PORT))
    print 'Listening at', s.getsockname()
    while True:
        data, address = s.recvfrom(MAX)
        if random.randint(0, 1):
            print 'The client at', address, 'says:', repr(data)
            s.sendto('Your data was %d bytes' % len(data), address)
        else:
            print 'Pretending to drop packet from', address
elif len(sys.argv) == 3 and sys.argv[1] == 'client':
    hostname = sys.argv[2]
    s.connect((hostname, PORT))
    print 'Client socket name is', s.getsockname()
    delay = 0.1
    while True:
        s.send('This is another message')
        print 'Waiting up to', delay, 'seconds for a reply'
        s.settimeout(delay)
        try:
            data = s.recv(MAX)
        except socket.timeout:
            delay *= 2  # wait even longer for the next request
            if delay > 2.0:
                raise RuntimeError('I think the server is down')
        else:
            break   # we are done, and can stop looping
             
    print 'The server says', repr(data)
else:
    print >>sys.stderr, 'usage: udp_remote.py server [ <interface> ]'
    print >>sys.stderr, '   or: udp_remote.py client <host>'
    sys.exit(2)

这里的s.connect((hostname, PORT))要领,可以让我们不消每次都挪用s.sendto('This is my message', ('127.0.0.1', PORT))。直接挪用

s.send('This is another message')。

 

    关键字:


天才代写-代写联系方式