首页 > 编程语言 > python网络编程socket

python网络编程socket

时间:2023-02-11 13:32:20浏览次数:45  
标签:udp socket python 编程 tcp 接字 recv 客户端

python网络编程socket

创建socket

在​

import socket
socket.socket(AddressFamily, Type)
Copy​

说明:

函数​

  1. Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET​
  2. Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)​

创建一个tcp socket(tcp套接字)​

import socket

# 创建tcp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# ...这里是使用套接字的功能(省略)...

# 不用的时候,关闭套接字
s.close()
Copy​

创建一个udp socket(udp套接字)​

import socket

# 创建udp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# ...这里是使用套接字的功能(省略)...
# 不用的时候,关闭套接字
s.close()
Copy​

udp网络程序-发送数据

创建一个基于udp的网络程序流程很简单,具体步骤如下:​

  1. 创建客户端套接字​
  2. 发送/接收数据​
  3. 关闭套接字​

import socket
# 1. 创建一个UDP的socket连接
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2. 获取用户输入的内容
data = input('请输入内容')
# 3. 准备接收方的地址和端口号
addr = ('127.0.0.1', 8080)
# 4. 将用户的输入内容进行编码,并发送到指定地址和端口
udp_socket.sendto(data.encode('gbk'), addr)
# 5. 接收传递过来的消息,并指定接受的字节大小
recv_data = udp_socket.recvfrom(1024)
# 6. 接收到的对象是一个元组,元组里有两个元素
print(recv_data)
# 6.1 元组里的第一个数据显示接收到内容
print(recv_data[0].decode('gbk'))
# 6.2 元组里的第二个数据显示发送方的地址和端口号
print(recv_data[1])
# 7. 关闭socket连接
udp_socket.close()
Copy​


接受数据-绑定信息

一般情况下,在一台电脑上运行的网络程序有很多,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定 但是如果需要做成一个服务器端的程序的话,是需要绑定的,想想看这又是为什么呢? 如果报警电话每天都在变,想必世界就会乱了,所以一般服务性的程序,往往需要一个固定的端口号,这就是所谓的端口绑定。 ​

绑定示例​

from socket import *

# 1. 创建套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)

# 2. 绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配
local_addr = ('', 7788) # ip地址和端口号,ip一般不用写,表示本机的任何一个ip
udp_socket.bind(local_addr)

# 3. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数

# 4. 显示接收到的数据
print(recv_data[0].decode('gbk'))

# 5. 关闭套接字
udp_socket.close()​

TCP客户端

相比较于TCP服务端,tcp的客户端要简单很多,如果说服务器端是需要自己买手机、查手机卡、设置铃声、等待别人打电话流程的话,那么客户端就只需要找一个电话亭,拿起电话拨打即可,流程要少很多。​

示例代码:​

from socket import *

# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)

# 目的信息
server_ip = input("请输入服务器ip:")
server_port = int(input("请输入服务器port:"))

# 链接服务器
tcp_client_socket.connect((server_ip, server_port))

# 提示用户输入数据
send_data = input("请输入要发送的数据:")
tcp_client_socket.send(send_data.encode("gbk"))

# 接收对方发送过来的数据,最大接收1024个字节
recvData = tcp_client_socket.recv(1024)
print('接收到的数据为:', recvData.decode('gbk'))

# 关闭套接字
tcp_client_socket.close()
Copy​

TCP服务端

在程序中,如果想要完成一个tcp服务器的功能,需要的流程如下:​

  1. socket创建一个套接字​
  2. bind绑定ip和port​
  3. listen使套接字变为可以被动链接​
  4. accept等待客户端的链接​
  5. recv/send接收发送数据​

示例代码:​

from socket import *

# 创建socket
tcp_server_socket = socket(AF_INET, SOCK_STREAM)

# 本地信息
address = ('', 7788)

# 绑定
tcp_server_socket.bind(address)

# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
tcp_server_socket.listen(128)

# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
# client_socket用来为这个客户端服务
# tcp_server_socket就可以省下来专门等待其他新客户端的链接
client_socket, clientAddr = tcp_server_socket.accept()

# 接收对方发送过来的数据
recv_data = client_socket.recv(1024) # 接收1024个字节
print('接收到的数据为:', recv_data.decode('gbk'))

# 发送一些数据到客户端
client_socket.send("thank you !".encode('gbk'))

# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
client_socket.close()
Copy​

TCP注意事项

1.tcp服务器一般情况下都需要绑定,否则客户端找不到这个服务器
2.tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机
3.tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的
当客户端需要链接服务器时,就需要使用connect进行链接,udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信
4.当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
5.listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的
6.关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。
7.关闭accept返回的套接字意味着这个客户端已经服务完毕
当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线​


标签:udp,socket,python,编程,tcp,接字,recv,客户端
From: https://blog.51cto.com/u_15954963/6050193

相关文章

  • python常用模块
    常用模块​OS模块​OS全称OperationSystem,即操作系统模块,这个模块可以用来操作系统的功能,并且实现跨平台操作。​importosos.getcwd()#获取当前的工作目录,即当前python......
  • python推流在html上显示
    1.websocket安装nodejs,并安装wsnpminstallwsnodeserver.jsletWebSocketServer=require('ws').Server,wss=newWebSocketServer({port:3303});wss.on('c......
  • 普通用户安装 python:Could not build the ssl module! Python requires a OpenSSL 1.
     001、普通用户安装python遇到如下问题:Couldnotbuildthesslmodule!PythonrequiresaOpenSSL1.1.1ornewer   002、解决方法exportCFLAGS=$(pkg......
  • C++PrimerPlus中文第六版第10章编程练习答案
    1、//bankaccount.h#ifndefBANKACCOUNT_H_#defineBANKACCOUNT_H_#include<string>classBankAccount{private: std::stringm_account_name; constchar*m_......
  • 在Ubuntu 20.04中使用源码方式安装python3.8
    在ubuntu上安装Python有两种方法:在线安装和源码编译安装。方法1:使用apt在线安装1.更新软件包列表并安装必备组件:$sudoaptupdate$sudoaptinstallsoftware-prop......
  • centos7下安装python3.8
    最近新买了台centos7服务器,自带的是python2.7,所以想升级到python3,以下即是详细升级步骤,方便日后查询。1.查看当前python版本[root@iZwz99sau950q2nhb3pn0aZ~]#pytho......
  • Java8函数式编程读后总结与感想
    1. 基本信息Java8函数式编程Java8Lambdas:FunctionalProgrammingfortheMasses[英]RichardWarburton著;王群锋译人民邮电出版社,2015年3月出版1.1. ......
  • vue 开启socket请求
    https://blog.csdn.net/sumikk/article/details/126454676?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-......
  • c#异步编程
    滴答的雨的异步编程系列文章hystar的异步编程系列文章小弟的异步编程系列文章 ......
  • Python引入模块报错:Import "openai" could not be resolvedPylancereportMissingImpor
    复制Openai的代码进行测试的时候,发生:Import"openai"couldnotberesolvedPylancereportMissingImports  以为是安装问题,检查安装,发现没有这个模块: 直接进行......