首页 > 编程语言 >Python socket详解

Python socket详解

时间:2023-01-10 11:48:18浏览次数:39  
标签:socket AF Python client 详解 cs 接字 客户端

目录

网络编程

1.基本概念

1.什么是客户端/服务器架构?

服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。它存在唯一目的就是等待客户端的请求,
并响应它们(提供服务),然后等待更多请求。

一个提供服务,一个请求服务得到相应的过程。

2.套接字:通信端点

套接字,就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。
从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通
信的接口,是应用程序与网络协议栈进行交互的接口。

  • python只支持AF_UNIX、AF_NETLINK、AF_TIPC 和 AF_INET ,重点使用基于网络的AF_INET

  • 套接字地址:主机-端口对(有效端口范围为0~65535)

3.套接字类型

  • 流式套接字(SOCK_STREAM):用于提供面向连接、可靠的数据传输服务。

  • 数据报套接字(SOCK_DGRAM):提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。

Python中的网络编程

首先介绍一下socket()模块函数

要创建套接字,必须使用socket.socket()函数,它一般的语法如下

socket(socket_family, socket_type, protocol=0)

socket_family如下(部分):

  • socket.AF_UNIX:用于同一台机器上的进程通信(既本机通信)
  • socket.AF_INET:用于服务器与服务器之间的网络通信
  • socket.AF_INET6:基于IPV6方式的服务器与服务器之间的网络通信

socket_type如下:

  • socket.SOCK_STREAM:基于TCP的流式socket通信
  • socket.SOCK_DGRAM:基于UDP的数据报式socket通信

套接字的内置方法

创建服务和客户端

  • 创建TCP服务
ss = socket()   # 创建服务器套接字
ss.bind()       # 套接字与地址绑定
ss.listen()     # 监听
cs = ss.accept()     # 接收客户端连接
cs.recv()/cs.send()  # 对话(接收/发送)
cs.close()      # 关闭客户端套接字(可选)
ss.close()      # 关闭服务器套接字(可选)
  • 创建TCP客户端
cs = socket()       #  创建客户端套接字
cs.connect()        #  尝试连接服务器
cs.send()/cs.recv() #  对话(发送 / 接收)
cs.close()          #  关闭客户端套接字

代码示例

# TCP服务
import socket
import threading


IP = ""
PORT = 80


def main():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind((IP, PORT))
    server.listen(5)
    print(f"[*] Listening on {IP}:{PORT}")

    while True:
        client, address = server.accept()
        print(f"[*] Accepted connection from {address[0]}:{address[1]}")
        client_header = threading.Thread(target=handle_client, args=(client, ), daemon=True)
        client_header.start()


def handle_client(client_server):
    with client_server as sock:
        request = sock.recv(1024)
        print(f'[*] Received: {request.decode("utf-8")}')
        send = "服务器端"
        sock.send(send.encode("utf-8"))


if __name__ == '__main__':
    main()

# TCP 客户端
import socket

target_host = "127.0.0.1"
target_port = 80

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    client.connect((target_host, target_port))

    send = "客户端"
    client.send(send.encode("utf-8"))
    response = client.recv(4096)
    print(response.decode())
except:
    print("连接失败!")
finally:
    client.close()

可以根据自己的想法进行扩展,例如持续连接进行交互,根据自己的要求进行断开连接,此时可以在客户端加个while True:
和一个判断语句,等等

标签:socket,AF,Python,client,详解,cs,接字,客户端
From: https://www.cnblogs.com/-Lucky-/p/17039661.html

相关文章

  • Python在命令行模式下如何退出命令行
    第一种:这种方法最简单,直接输入Ctrl+Z ,再回车,即可退出; 第二种:输入exit(),再回车,也可以; 第三种:输入quit(),再回车,也行; ......
  • java socket通信
    1.socket通信模型2.代码示例2.1服务端packagecom.java4all.controller;importjava.io.*;importjava.net.ServerSocket;importjava.net.Socket;/***Author:yunqing*......
  • @ComponentScan详解&@SpringBootApplication的scanBasePackages属性
    一、@ComponentScan源码@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE})@Documented@Repeatable(ComponentScans.class)public@interfaceComponen......
  • Python 合并多张图片至一张图片
    PDF有多页,一次性转成JPG图片,JAVA报内存溢出,现改为,每一页存成一张图片,然后再将多张图片合成一张图片。安装库pip3installImage-ihttps://pypi.tuna.tsinghua.edu.......
  • python 读与写文本
    目录python读取文本:方法1:方法2:python写文本方法1:方法2:附加各种文本读写模式python读取文本:方法1:withopen(txt_path,"r")asfr:lines=fr.readlines()forl......
  • 用 Python 脚本实现电脑唤醒后自动拍照 截屏并发邮件通知
    背景背景是这样的,我的家里台式机常年休眠,并配置了WakeOnLan(WOL)方便远程唤醒并使用.但是我发现,偶尔台式机会被其他情况唤醒,这时候我并不知道,结果白白运......
  • python单例模式
    单例模式单例模式(SingletonPattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对......
  • Python网络爬虫get方法出现乱码的解决的三种方案
    给大家祭出网络爬虫过程中三种中文乱码的处理方案,希望对大家的学习有所帮助。方案一将requests.get().text改为requests.get().content我们可以看到通过text()方法获取......
  • Python 中获取文件名
    Python获取文件名importosimportsys#①获取当前文件名os.path.basename(__file__)#②获取程序启动文件名os.path.basename(sys.argv[0])#__file__#获取当前文件的......
  • Python序列操作举例
    #序列操作举例#序列包括字符串、列表和元组importitertoolslisted=[1,2,3]listed*=2print(listed)#[1,2,3,1,2,3]print(id(listed))#20622639......