首页 > 编程语言 >5.26日学习总结之网络编程socket

5.26日学习总结之网络编程socket

时间:2023-06-10 14:22:23浏览次数:62  
标签:socket AF 编程 SOCK 5.26 print data 客户端

Python socket编程在网络上的教程较少,菜鸟中也只是给出了一小段描述,在此我推荐白羽黑夜socket编程 | 白月黑羽 (byhy.net)其中的描写非常详细,本人也是在此学习的。

socket又被称作套接字,可以简单的看作是两个地址(ip,port地址)之间通过socket的函数来进行传递数据。

socket在客户端的定义:

#  socket.socket([family[, type[, proto]]])
#family: 套接字家族可以使 AF_UNIX 或者 AF_INET。
#type: 套接字类型可以根据是面向连接的还是非连接分为 
#SOCK_STREAM 或 SOCK_DGRAM。
#protocol: 一般不填默认为 0。
# 下面给出一段代码示例

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    address = ('127.0.0.1', 10086) #socket链接的地址需为元组的形式!
    s.connect(address)

socket在服务器端的定义,与服务器端类似:

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    addr = ('127.0.0.1', 10086)
    s.bind(addr)  # 绑定端口,参数为元组

很明显可以注意到,客户端与服务器端的地址是一致的(当然也可以不完全一样,在此不表)

一个简易的服务器端代码如下:

# 摘自白羽黑夜socket编程 | 白月黑羽 (byhy.net)
from socket import * # 主机地址为空字符串,表示绑定本机所有网络接口ip地址 # 等待客户端来连接 IP = '' # 端口号 PORT = 50000 # 定义一次从socket缓冲区最多读入512个字节数据 BUFLEN = 512 # 实例化一个socket对象 # 参数 AF_INET 表示该socket网络层使用IP协议 # 参数 SOCK_STREAM 表示该socket传输层使用TCP协议 s = socket(AF_INET, SOCK_STREAM) # socket绑定地址和端口 s.bind((IP, PORT)) # 使socket处于监听状态,等待客户端的连接请求 # 参数 8 表示 最多接受多少个等待连接的客户端 s.listen(8) print(f'服务端启动成功,在{PORT}端口等待客户端连接...') data, addr = s.accept() print('接受一个客户端连接:', addr) while True: # 尝试读取对方发送的消息 # BUFLEN 指定从接收缓冲里最多读取多少字节 recved = dataSocket.recv(BUFLEN) # 如果返回空bytes,表示对方关闭了连接 # 退出循环,结束消息收发 if not recved: break # 读取的字节数据是bytes类型,需要解码为字符串 info = recved.decode() print(f'收到对方信息: {info}') # 发送的数据类型必须是bytes,所以要编码 datat.send(f'服务端接收到了信息 {info}'.encode()) # 服务端也调用close()关闭socket datat.close() s.close()

客户端代码如下:

from socket import *

IP = '127.0.0.1'
SERVER_PORT = 50000
BUFLEN = 1024

# 实例化一个socket对象,指明协议
datat = socket(AF_INET, SOCK_STREAM)

# 连接服务端socket
data.connect((IP, SERVER_PORT))

while True:
    # 从终端读入用户输入的字符串
    toSend = input('>>> ')
    if  toSend =='exit':
        break
    # 发送消息,也要编码为 bytes
    data.send(toSend.encode())

    # 等待接收服务端的消息
    recved = data.recv(BUFLEN)
    # 如果返回空bytes,表示对方关闭了连接
    if not recved:
        break
    # 打印读取的信息
    print(recved.decode())

data.close()

socket通常通过send(data)/sendto(data,address)进行消息发送,区别是一个给所有链接发送数据一个给指定地址发送数据。(私聊和群发的区别)

socket中所发的所有数据都需要进行编码,例如

data = '这是一条字符串'    #不能用来作为send/sendto的参数
data = data.encode('utf-8') #也可以是别的编码格式
#此时data才能作为send/sendto的参数 

接收端同样不能直接对接收到的数据进行print

需要对接收的假定为data=data.decode()进行解码,转化为字符串的形式才能print。

标签:socket,AF,编程,SOCK,5.26,print,data,客户端
From: https://www.cnblogs.com/xxaxf/p/17471196.html

相关文章

  • 报告PPT--Python程序设计,不仅仅是学习编程(35页)
    本文PPT是董付国老师在“全国青少年STEAM创客教育论坛暨粤东青少年创客文化节”的报告内容。学习任何程序设计语言,都应结合具体的实际问题,不可空学语法纸上谈兵,更不能把程序设计作为一门孤立的课来讲。作为大学任课教师,可以结合学生专业理论课中的理论、算法或问题来讲Python;作为中......
  • 模板元编程之函数模板(一)
    一、概述函数模板提供了一种函数行为,该函数行为可以用多种不同的类型进行调用,换句话说函数模板代表一个函数家族,它的表示看起来和普通的函数很相似,唯一的区别就是有些函数元素是未确定的,这些元素将在使用时被参数化。下面是一个返回两个值中最大者的函数模板template<typenam......
  • 报告PPT(123页):Python编程基础精要
    本文所发PPT是董付国老师2018年5月份在成都第二届全国高校“数据科学与大数据技术”专业教学研讨会(电子工业出版社)上作报告用的。......
  • C语言编程—强制类型转换
    强制类型转换是把变量从一种类型转换为另一种数据类型。例如,如果您想存储一个long类型的值到一个简单的整型中,您需要把long类型强制转换为int类型。您可以使用强制类型转换运算符来把值显式地从一种类型转换为另一种类型,如下所示:(type_name)expression请看下面的实例,使用强......
  • 零代码编程:用ChatGPT提取新闻网站上的文本
    现在国内的新闻网站上,乱七八糟的广告和其他不相干内容太多。怎么能批量提取出新闻标题和正文呢?GeneralNewsExtractor(GNE)是一个通用新闻网站正文抽取模块,输入一篇新闻网页的HTML,输出正文内容、标题、作者、发布时间、正文中的图片地址和正文所在的标签源代码。GNE在提取今日头条、......
  • UDP编程
    字节序概念:是指多字节数据的存储顺序小端格式:将低位字节数据存储在低地址(LSB)大端格式:将高位字节数据存储在低地址(MSB)特点1、网络协议指定了通讯字节序—大端2、只有在多字节数据处理时才需要考虑字节序3、运行在同一台计算机上的进程相互通信时,一般不用考虑字节序4、异构......
  • Python递归法计算棋盘上所有路径总奖品最大值(京东2016编程题)
    问题描述:假设有一个6x6的棋盘,每个格子里有一个奖品(每个奖品的价值在100到1000之间),现在要求从左上角开始到右下角结束,每次只能往右或往下走一个格子,所经过的格子里的奖品归自己所有。问最多能收集价值多少的奖品。思路:每个格子所在路径的总奖品最大值依赖于左边的格子或右边的格子。......
  • Python编写编程作业批量自动打分程序的思路与实现
    总体思路:把接口明确地告诉学生(本文后面的代码要求学生程序中必须有个函数叫做searchOnede),然后学生把Python程序文件(学号_姓名.py)以任何方式提交给老师,放到同一文件夹中。下面的代码首先由老师编写一个自己认为的最佳和最优实现,然后把学生的程序文件作为模块导入并调用其中的searchO......
  • Python标准库socketserver使用线程混入实现异步TCP服务器
    功能描述:使用Python标准库socketserver中提供的ThreadingTCPServer实现异步TCP服务端程序,隐藏线程创建与管理细节,自动为每个客户端连接创建线程并处理数据。服务端代码: 客户端代码:......
  • Python标准库socketserver实现UDP协议时间服务器
    Python标准库socketserver进行了更高一级的封装,非常适合服务端代码的编写,本文通过改写时间服务器的案例来演示标准库socketserver的用法,更多案例最近会陆续推送。服务端代码: 客户端代码: 运行情况:   ......