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

发布时间 2023-10-19 16:13:33作者: songjunwan

简单的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来解码