Introduction détaillée aux sockets en Python

零下一度
Libérer: 2017-07-18 15:23:35
original
2098 Les gens l'ont consulté

Le socket est généralement appelé « socket », qui est utilisé pour décrire l'adresse IP et le port. Il s'agit du handle d'une chaîne de communication. Les applications envoient généralement des requêtes au réseau ou répondent aux requêtes du réseau via un « socket ».

Socket est originaire d'Unix, et l'une des philosophies de base d'Unix/Linux est "tout est un fichier". Pour les fichiers, utilisez l'option [Ouvrir] [Lecture et écriture] [Fermer". ] pour fonctionner. Socket est une implémentation de ce mode. Socket est un fichier spécial. Certaines fonctions de socket sont des opérations sur celui-ci (lecture/écriture des E/S, ouverture, fermeture)

socket et La différence entre le fichier :

Le module de fichiers consiste à [ouvrir] [lire et écrire] [fermer] pour un fichier spécifié

1. module socket

Socket, communément appelé socket, est en fait une combinaison d'adresse IP et de port. Semblable à cette forme (ip, port), où ip représente un certain hôte et port représente une application. Nous pouvons communiquer avec un autre hôte via socket.

L'analyse du code source du socket fait partie de la série d'articles tarnado, en cours de rédaction. . . . .

1. Méthode de communication

communication TCP

communication UDP

Communication basée sur Unix

2. Méthode socket

# 暂时知道的也就这么多,之后要是在用到其他的我会继续进行保存Methods of socket objects (keyword arguments not allowed):
    
    _accept() -- accept connection, returning new socket fd and client address
    bind(addr) -- bind the socket to a local address 给本地地址绑定一个socket套接字
    close() -- close the socket 关闭一个套接字
    connect(addr) -- connect the socket to a remote address     连接到远端主机
    connect_ex(addr) -- connect, return an error code instead of an exception
    dup() -- return a new socket fd duplicated from fileno()
    fileno() -- return underlying file descriptor
    getpeername() -- return remote address [*]
    getsockname() -- return local address
    getsockopt(level, optname[, buflen]) -- get socket options
    gettimeout() -- return timeout or None
    listen([n]) -- start listening for incoming connections
    recv(buflen[, flags]) -- receive data   接受数据
    recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)    接受数据到缓冲区中,
    recvfrom(buflen[, flags]) -- receive data and sender's address    recvfrom_into(buffer[, nbytes, [, flags])      -- receive data and sender's address (into a buffer)sendall(data[, flags]) -- send all data 发送数据给远端主机,3.x之后只能发送字节形式,因此在发送的时候一般要进行转换bytes
    send(data[, flags]) -- send data, may not send all of it 也是发送数据,区别在于send发送的不完整,随机进行发送的,二sendall发送的完整
    sendto(data[, flags], addr) -- send data to a given address 基于udp发送数据的
    setblocking(0 | 1) -- set or clear the blocking I/O flag    是否设置成阻塞模式0 代表阻塞,1代表非阻塞
    setsockopt(level, optname, value) -- set socket options     设置一些socket的桉树
    settimeout(None | float) -- set or clear the timeout    设置超时市场
    shutdown(how) -- shut down traffic in one or both directions    
    if_nameindex() -- return all network interface indices and names
    if_nametoindex(name) -- return the corresponding interface index
    if_indextoname(index) -- return the corresponding interface name
 
     [*] not available on all platforms!
Copier après la connexion

2. Robot de chat simple

Si vous envoyez une donnée, le serveur lui répondra avec une donnée + Bonjour

 1 # -*- coding:utf-8 -*- 2 # zhou 3 # 2017/7/3 4  5 import socket 6 # 创建一个server对象 7 server_obj = socket.socket() 8 # 绑定一下端口 9 server_obj.bind(("127.0.0.1", 8888, ))10 # 设置监听的等待队列长度为5,当大于5的时候就拒绝连接11 server_obj.listen(5)12 13 while True:14     # 等待接受客户端的连接,为阻塞方式15     conn, address = server_obj.accept()16     # 发送欢迎信息17     conn.sendall(bytes("欢迎来到简单的聊天室..", encoding='utf-8'))18     while True:19         # 接受到对面的消息就会把对面消息后面加上你好重新发送回去20         ret = str(conn.recv(1024), encoding='utf-8')21         if ret == 'q':22             # 如果对面发送的为q就退出23             break24         conn.sendall(bytes(ret + ",你好", encoding='utf-8'))
Copier après la connexion
serveur
# -*- coding:utf-8 -*-# zhou# 2017/7/3import socket

client = socket.socket()
client.connect(("127.0.0.1", 8888, ))# 接受欢迎信息并打印ret = str(client.recv(1024), encoding='utf-8')print(ret)while True:
    message = input("请输入您要发送的内容:")
    client.sendall(bytes(message, encoding='utf-8'))if message == 'q':breakret = str(client.recv(1024), encoding='utf-8')print(ret)
Copier après la connexion
client

3. Téléchargement FTP simple

Implémentation du téléchargement d'une image sur le serveur

 1 # -*- coding:utf-8 -*- 2 # zhou 3 # 2017/7/2 4  5 import socket 6  7 server = socket.socket() 8 server.bind(("127.0.0.1", 9998, ))  # 绑定ip 9 server.listen(5)10 11 while True:12     conn, address = server.accept()13     # 连接之后首先接收文件大小14     file_size = int(str(conn.recv(1024), encoding='utf-8'))15     # 用来解决粘包问题的16     conn.sendall(bytes("1001", encoding='utf-8'))17     # 已经接受的文件大小18     has_size = 019     num = 120     # 连接之后接收文件21     f = open("new.jpg", 'wb')22     while True:23         num += 124         if file_size == has_size:25             break26         data = conn.recv(1024)27         f.write(data)28         has_size += len(data)29     f.close()   # 关闭文件
Copier après la connexion
serveur ftp

 1 # -*- coding:utf-8 -*- 2 # zhou 3 # 2017/7/2 4  5  6 import os 7 import socket 8  9 client = socket.socket()10 11 client.connect(("127.0.0.1", 9998), )12 # 传送文件大小13 file_size = os.stat("1.jpg").st_size14 print(file_size)15 # 发送文件大小16 client.sendall(bytes(str(file_size), encoding='utf-8'))17 client.recv(1024)   # 解决粘包问题18 # 发送文件19 with open("1.jpg", 'rb') as f:20     for line in f:21         client.sendall(line)22 client.close()
Copier après la connexion
client ftp

4. Résoudre le problème persistant

Concernant la description du troisième téléchargement FTP ci-dessus,

Résoudre le problème persistant lorsque nous téléchargeons un fichier, téléchargez d'abord sa taille. , nous devons rédiger une déclaration d'acceptation, et le serveur doit immédiatement nous envoyer des données pour confirmation après avoir reçu la taille du fichier, afin que nous puissions parfaitement diviser la taille des données.

 

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!