目录
简单的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