首页 > 其他分享 >10月19日简单的cs架构软件编写

10月19日简单的cs架构软件编写

时间:2023-10-19 16:27:26浏览次数:27  
标签:10 soc socket 19 cs 服务器 data conn 客户端

目录

简单的cs架构软件编写

首先创建两个文件

如图

这里两个文件都需要使用到socket这个模块

首先是通信服务器的编写

第一步导入socket这个模块

第二步创建一个socket对象soc,它表示服务器的主要通信端口。

第三步用socket里面的bind()方法,通过这个方法客户端尝试连接服务器。传入一个元组,元组的第一个元素是要绑定到服务器的IP(172.17.8.49)地址,第二个元素是服务器的端口号(8080)。这就可以让服务器获取来自该IP地址和端口的连接请求。

第四步使用socket里面的listen(这个括号里暂定为5),开启服务器并设置半连接池的大小为5。这意味着服务器可以同时处理最多5个等待连接的客户端。如果这个半连接池满了,会拒绝后面的连接请求。

第五步使用socket里面的accept()方法等待客户端的连接请求,一旦有客户端连接它将返回一个新的socket对象conn(相当于连接接口),以及客户端的地址信息addr。

第六步使用socket里面的recv(这个括号里暂定为1024)方法接收来自客户端的数据,这里接收的数据最大长度是1024字节。接收到的数据将储存到提前定义好的变量data中。

第七步使用socket里面的send(需要用bytes格式也就是b'内容')方法向客户端发送数据,下面的代码发送的是b'ok',表示成功。

第八步使用socket里面的close()方法来关闭与客户端的连接。

第九步还是使用socket里面的close()方法来关闭服务器的主要通信端口。(第八步和第九步虽然都是关闭但是它们关闭的对象不一样,第八步关闭的是conn,第九步关闭的是soc)

这些步骤演示了一个简单的客户端-服务器通信过程,客户端通过网络连接到服务器,服务器接收客户端的请求并向客户端发送响应。

具体代码

#导入一个socket模块来建立一个简单的通信服务器
import socket

#socket.AF_INET表示使用 IPv4 地址族,这是 Internet 上常用的地址族。socket.SOCK_STREAM 表示创建一个基于 TCP 协议的 Socket 对象
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#相当于绑定ip地址和端口号  将两者以元组的形式写进去
soc.bind(('172.17.8.49', 8080))  #如果写本机ip,外部可以访问
# soc.bind(('127.0.0.1', 8080))   #如果写127.0.0.1,只能自己访问

#开启服务器
soc.listen(5)#这个5是半连接池的大小

#等待客户端发送请求
conn, addr = soc.accept()#conn表示新的socket对象,addr表示客户端的地址信息

#接收客户端的数据
data = conn.recv(1024)#recv就是接收的作用,里面1024指能接收1024个字节,data指的是客户端发过来的数据
print(f'收到客户端的请求:{data}')#这里是给这个客户端发来的请求输出出来

#conn.send 是发数据,数据必须是bytes格式也就是b'内容'
conn.send(b'ok')

#关闭与客户端的连接
conn.close()
#关闭服务器的主要通信端口
soc.close()

上面代码生成socket对象的那两个参数分别代表

  • socket.AF_INET 表示使用 IPv4 地址族,这是 Internet 上常用的地址族。可以用于在 IPv4 网络上进行通信。
  • socket.SOCK_STREAM 表示创建一个基于 TCP 协议的 Socket 对象,这种类型的 Socket 适合于建立可靠的、面向连接的通信,通常用于需要数据可靠传输的场景,如 HTTP、FTP 等协议。

然后就是客户端的步骤

第一步还是导入socket这个模块。

第二步创建一个socket对象soc,用于客户端的通信。

第三步使用socket里面的connect()方法,通过这个方法客户端尝试连接服务器。传入一个元组,元组的第一个元素是要连接的服务器的IP地址,第二个元素是服务器的端口号。这个方法会尝试建立与服务器的连接。

第四步使用socket里面的send()方法,给服务器发送数据。注意里面要用bytes类型(暂定为b'sleep')

第五步使用socket里面的recv(这个括号里暂定为1024)方法接收来自服务器的数据。这里接收的数据最大长度是1024字节。接收到的数据将储存到提前定义好的变量data中。

第六步使用socket里面的close()方法来关闭与服务器之间的连接,释放资源

这些步骤是客户端向服务器发起连接请求,发送数据,接收数据,然后关闭连接。这是一个简单的请求-响应模型,常用于网络通信中的客户端和服务器之间的数据传输。

具体代码

#导入socket方法
import socket
#创建一个socket对象
soc = socket.socket()
#连接服务器(以元组的形式传进去)
soc.connect(('172.17.8.49', 8080))
#这里给服务器发送数据
soc.send(b'sleep')
#接收来自服务器的数据,同时把数据赋值给data这个变量
data = soc.recv(1024)
print(f'收到服务器的回复{data}')
#关闭连接与服务器的连接,释放资源
soc.close()

结果为

这里提一点,因为无论是我的服务器还是客户端此时它们的发送数据只能是ASCII码,但是我想发送汉字应该怎么办呢?这里就可以使用文本编码的方式来转换成字节串

服务器代码修改如下:

#导入一个socket模块来建立一个简单的通信服务器
import socket

#socket.AF_INET表示使用 IPv4 地址族,这是 Internet 上常用的地址族。socket.SOCK_STREAM 表示创建一个基于 TCP 协议的 Socket 对象
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#相当于绑定ip地址和端口号  将两者以元组的形式写进去
soc.bind(('172.17.8.49', 8080))  #如果写本机ip,外部可以访问
# soc.bind(('127.0.0.1', 8080))   #如果写127.0.0.1,只能自己访问

#开启服务器
soc.listen(5)#这个5是半连接池的大小

#等待客户端发送请求
conn, addr = soc.accept()#conn表示新的socket对象,addr表示客户端的地址信息


#接收客户端的数据
data = conn.recv(1024)#recv就是接收的作用,里面1024指能接收1024个字节,data指的是客户端发过来的数据
#解码收到的字节串以还原文本
huanyuan = data.decode('utf-8')

print(f'收到客户端的请求:{huanyuan}')#这里是给这个客户端发来的请求输出出来




#将文本编码为字节串(UTF-8编码)
shuju = '可以'.encode('utf-8')


#conn.send 是发数据,数据必须是bytes格式也就是b'内容'
conn.send(shuju)

#关闭与客户端的连接
conn.close()
#关闭服务器的主要通信端口
soc.close()

然后是客户端的修改

#导入socket方法
import socket

#创建一个socket对象
soc = socket.socket()

#连接服务器(以元组的形式传进去)
soc.connect(('172.17.8.49', 8080))

#将文本编码为字节串(UTF-8编码)
shuju = '需要连接'.encode('utf-8')

#这里给服务器发送数据
soc.send(shuju)
#接收来自服务器的数据,同时把数据赋值给data这个变量
data = soc.recv(1024)


#解码收到的字节串以还原文本
huanyuan = data.decode('utf-8')


print(f'收到服务器的回复:{huanyuan}')#这里是把这个服务器发来的请求输出出来


#关闭连接与服务器的连接,释放资源
soc.close()

这两个代码里面多了编码以及解码的方式

编码使用python里面的内置方法encode()来编码,括号里推荐使用utf-8这是是万国通用的。解码是用了python里面的内置方法decode()来解码,这个括号里也推荐使用utf-8来解码

标签:10,soc,socket,19,cs,服务器,data,conn,客户端
From: https://www.cnblogs.com/slzjb/p/17774968.html

相关文章

  • 电子级PFA试剂瓶50ml 100ml 250ml 500ml高纯实验级PFA取样瓶
    PFA试剂瓶(PFAreagentbottle)一、产品简介PFA试剂瓶又叫PFA样品瓶、PFA取样瓶、PFA广口瓶。我司PFA试剂瓶分为GL45的广口瓶和GL32的细口瓶。PFA塑料的耐化学腐蚀性,对所有化学品都耐腐蚀,摩擦系数在塑料中低,还有很好的电性能,其电绝缘性不受温度影响。因其未添加回料具有低的本底,金......
  • [USACO19DEC] Greedy Pie Eaters P 区间dp
    题目背景FarmerJohnhasMMcows,convenientlylabeled1…M1…M,whoenjoytheoccasionalchangeofpacefromeatinggrass.Asatreatforthecows,FarmerJohnhasbakedNNpies(1≤N≤3001≤N≤300),labeled1…N1…N.Cowiienjoyspieswithlabelsinther......
  • jemeter插件管理及jp@gc - PerfMon Metrics Collector插件安装
    插件管理安装地址:下载地址在可用插件选项中找到下面的插件(我是已经安装了):安装需要联网,安装后提示重启,重启就能使用了: 添加两个监控选项: 启动ServerAgent: 然后可用开始进行测试,如果一运行ServerAgent就退出的话,见:解决方法 ......
  • jemeter使用jp@gc - PerfMon Metrics Collector性能监控startAgent2.2.1版本崩溃记录
    jemeter进行性能测试时,一开启startAgent就退出,以下是正常情况:原因:JDK版本与startAgent版本不对应解决方式:之前使用的是jdk1.8.0_321,更换为jdk1.8.0_141后就正常了 ......
  • 加拿大生信开源学习资源Bioinformatics.ca
    之前给大家推荐过教育部首批490门“国家精品在线开放课程”,里面很多跟生物或编程相关的免费经典课程。除了国内这些开放的学习资源外,还有许多国外的免费资源,比如英语写作常见错误和视频中是斯坦福大学老师的授课视频,很经典。如果时间紧张,只看前两节也挺好。今天给大家推荐的是加拿......
  • css多个元素一行排列的方法
    1、弹性盒子模型(FlexBox),不考虑兼容性问题的情况下,建议新手直接使用这种模式,简单,最重要的是元素不会浮动,不会影响后面的元素的布局,比如下面代码中的我在底层这个div的显示没有任何影响。<html><head><style>#tasklist{background-col......
  • 你也许不再需要使用 CSS Media Queries(媒体查询)了
    你也许不再需要使用CSSMediaQueries(媒体查询)了最近,CSS引入了一项新功能:ContainerQueries。它可以替代MediaQueries并实现MediaQueries无法胜任的任务。超越MediaQueries的功能让我们想象一个场景:在网页上有两列卡片。我们希望在卡片宽度较窄时,卡片内部呈上下布局......
  • 20211102尹子扬 实验二 openssl命令测试
    点击查看代码openssldgst-sm3-outsn.sm3sn.txt3.(用od打印时发现有\n换行符,所以在第4步时不加-n,否则会生成错误的hash值)点击查看代码od-tc-Ansn.sm34.(正确的是不带-n的hash值)点击查看代码echo"20211102"|openssldgst-sm3代码截图:......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(10) -- 在Dat
    有时候,一些数据的录入可能需要使用表格直接录入会显得更加方便快捷,这种情况有时候也是由于客户使用习惯而提出,本篇随笔介绍在WPF应用端上使用DataGrid来直接新增、编辑、保存数据的处理。录入数据的时候,我们都采用在一个窗体界面中,根据不同内容进行录入,但是有时候涉及主从表的数......
  • KBL610-ASEMI整流桥KBL610参数、规格、尺寸
    编辑:llKBL610-ASEMI整流桥KBL610参数、规格、尺寸型号:KBL610品牌:ASEMI芯片个数:4封装:KBL-4恢复时间:>50ns工作温度:-55°C~150°C浪涌电流:200A正向电流:6A反向耐压:1000V正向压降:1.10V引脚数量:4KBL610整流桥特性:ASEMI品牌KBL610是采用工艺芯片,该芯片具有良好的稳定性及抗......