Python网络编程socket模块实例解析

网络也是IO的一种,在Python中有专门的socket模块用来处理网络操作的。

socket通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过”套接字”向网络发出请求或者应答网络请求。

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。

(1)利用socket进行简单的链接

Python里面的socket支持UDP、TCP、以及进程间的通信,socket可以把我们想要发送的东西封装起来,发送过去,然后反解成原来的样子,事实上网路通信可以理解成都是建立在socket之上,下面的代码是演示利用socket进行简单的链接

#要成一次通信,至少要有两个人,也就是一个服务端,一个客户端

#服务端

'''必须先开启着,等待客户端来进行链接请求,所以自己要先有个地址,也就是IP,也要现有自己的端口,没有端口进不去'''

import socket

sk= socket.socket()#创建对象

sk.bind(('127.0.0.1',9999,))#绑定IP和端口,以一个元组的方式传进去

sk.listen(5)#在前面链接已经建立的情况下,后面最多让五个人等待

while True:#让服务器端处于可以永远处于接受客户端请求的状态

conn,address=sk.accept()

print(conn,address)

'''

监听端口,等待以及接受客户端的请求,有可能会阻塞,主要功能是建立链接,以及接受客户端信息

conn相当于双方建立的这个链接,之后互相的通信要依靠这个链接;

address指的的对方的IP和端口

'''

下面是客户端代码

#客户端

import socket

obj =socket.socket()

'''相对于客户端,制定要链接谁就好了

'''

obj.connect(('127.0.0.1',9999,))#链接服务端

obj.close()#链接之后关闭

我们先让服务器端启动,然后再启动客户端,结果如图所示

('127.0.0.1', 36126)

('127.0.0.1', 36128)

('127.0.0.1', 36130)

成功打印出了每次的链接,以及客户端的IP以及端口号

(2)基于socket实现简单的传送消息

然后用是客户端代码

#客户端

import socket

obj =socket.socket()

'''相对于客户端,制定要链接谁就好了

'''

obj.connect(('127.0.0.1',9999,))#链接服务端

'''

客户端去链接服务端,如果服务器端没有返回消息给客户端,则客户端会一直

在recv状态,一直等待服务器的消息

'''

result1= obj.recv(2014)#表示最多接收1024个字节,超过了下次接收、

result2= str(result1,encoding='utf-8')

print(result2)

obj.close()#链接之后关闭

当启动一次客户端建立一次链接,就会收到消息,结果如图

(3)基于socket实现聊天机器人

下面是客户端代码

#客户端

import socket

obj =socket.socket()

'''相对于客户端,制定要链接谁就好了

'''

obj.connect(('127.0.0.1',9999,))#链接服务端

'''

客户端去链接服务端,如果服务器端没有返回消息给客户端,则客户端会一直

在recv状态,一直等待服务器的消息

'''

result1= obj.recv(2014)#表示最多接收1024个字节,超过了下次接收、

result2= str(result1,encoding='utf-8')

print(result2)

while True:

data = input('请输入你要发送的内容:')

if data == 'q':

obj.sendall(bytes(data, encoding='utf-8'))

print('链接断开')

break

else:

obj.sendall(bytes(data,encoding='utf-8'))

rec_byte = obj.recv(1024)#发了之后,接收信息

rec_str = str(rec_byte,encoding='utf-8')

print(rec_str)

obj.close()#链接之后关闭

结果如图所示

(4)利用socket传送图片文件

下面是客户端

#客户端

import os

import socket

obj =socket.socket()

obj.connect(('127.0.0.1',9999,))#链接服务端

'''

客户端去链接服务端,如果服务器端没有返回消息给客户端,则客户端会一直

在recv状态,一直等待服务器的消息

# '''

#obj.sendall(bytes('你好',encoding='utf-8'))

ret_bytes = obj.recv(1024)

ret_str = str(ret_bytes,encoding='utf-8')

print(ret_str)

#发送文件大小

size=os.stat('linuxidc.png').st_size#获取文件大小

obj.sendall(bytes(str(size),encoding='utf-8'),)#文件大小的int型,要先转化为字符串

with open('linuxidc.png','rb')as f:

for line in f:

obj.sendall(line)

obj.close()

Linux公社微信号ID:linuxidc_com

扫码左边二维码关注Linux公社

更多Python相关信息见Python 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=17

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址:https://www.linuxidc.com/Linux/2018-12/156062.htm

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181228B06TX600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券