Python中Socket编程

1.介绍

Sockets是什么:

  • Socket式电脑网络中进程间数据流的端点。
  • Socket操作系统的通信机制。
  • 应用程序通过Socket进行网络数据的传输。

Socket分为UDP和TCP两种不同的通信方式。

为什么是Socket?

  • Socket能够适应多种网络协议
  • Socket是基础应用,了解Socket可以举一反三
  • 服务器传输大量涉及网络协议,离不开Socket应用

TCP通信过程和Socket通信过程:

在这里插入图片描述

在这里插入图片描述

2.Socket通信入门

2.1 服务器端程序

import socket

#创建实例
sk = socket.socket()
#定义绑定ip和port
ip_port = ("127.0.0.1",8888)

#绑定监听
sk.bind(ip_port)
#最大连接数
sk.listen(5)
print("正在接受数据")
#接收数据
conn,address =sk.accept()

#返回给客户端一条消息
msg ="hello world"
#verson 3.7.0
#python3.x以上,网络数据的发送接收都是byte类型
#如果发送的数据是string类型的则需要进行编码
conn.send(msg.encode())

#主动关闭连接
conn.close()

2.2 socket客户端程序

import socket

#访问服务器端的ip和端口
ip_port = ("127.0.0.1", 8888)
#实例初始化
client = socket.socket()
#连接主机
client.connect(ip_port)

#接收主机信息
data = client.recv(1024)

#打印接收的数据
print(data.decode())

2.3 socket客户端连续消息发送

客户端:

import socket

client = socket.socket()

ip_port = ("127.0.0.1",8888)

client.connect(ip_port)

data = client.recv(1024)

print(data.decode())

while True:
    #输入发送的消息
    msg_input  =  input("请输入发送的消息:")

    client.send(msg_input.encode())

    if msg_input == "exit":

        break
    #接收消息
    data = client.recv(1024)

    print(data.decode())

服务器端:

import socket

sk = socket.socket()

ip_port =  ("127.0.0.1",8888)

sk.bind(ip_port)

sk.listen(5)

while True:

    print("正在等待接受数据..........")

    conn,address = sk.accept()

    msg = "连接成功"

    conn.send(msg.encode()) 
    
    # 不断接收客户端发来的消息   
    while True:
	 # 接收客户端信息
        data = conn.recv(1024)

        pirnt(data.decode())

        if data == b"exit":

            break
        #处理客户端信息
        conn.send(data)
        #同时发送一个随机数
        conn.send(str(random.randint(1,1000)))

    conn.close()

2.4 实例化参数含义

socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None)

family:地址系列应为AF_INET(默认值),AF_INET6,AF_UNIX,AF_CAN或AF_RDS。
(AF_UNIX 域实际上是使用本地 socket 文件来通信)

type:套接字类型应为SOCK_STREAM(默认值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。
SOCK_STREAM 是基于TCP的,有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料传送。
SOCK_DGRAM 是基于UDP的,无保障的面向消息的socket,多用于在网络上发广播信息。

proto:协议号通常为零,可以省略,或者在地址族为AF_CAN的情况下,协议应为CAN_RAW或CAN_BCM之一。

fileno:如果指定了fileno,则其他参数将被忽略,导致带有指定文件描述符的套接字返回。与socket.fromfd()不同,fileno将返回相同的套接字,而不是重复的。这可能有助于使用socket.close()关闭一个独立的插座。

3.网络通讯实现

基于UDP的Socket实现:

import socket

#创建实例
sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#定义绑定ip和port
ip_port = ("127.0.0.1",8888)

#绑定监听
sk.bind(ip_port)
#while True:
	#接收数据
	data = sk.recv(1024)
	#打印
	print(data.decode())
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值