python基础8_1-socket(一)通信案例消息发送和接收

1、sokect客户端
客户端向服务器请求连接,连接上之后,再进行交互
客户端实现逻辑流程如下:
1. 生成socket连接对象
2. 开始连接
3. 发送数据
4. 接收数据
5. 关闭sokect

具体实现的代码如下所示:

# Author: Mr.Xue
# 2019.10.29
# socket_client.py

import socket

client = socket.socket() # 声明socket类型,同时生成socket连接对象
client.connect(('localhost', 6961)) # 开始连接,ip地址为本地,端口号为6961

# 接收客户端发来的文件
# f = open("t1.avi", "wb")

while True:
	msg = input(">>") # 输入要发送的信息
	print(len(msg)) 
	if len(msg) == 0: continue # 判断输入的信息是否为空,如果空,重新输入
	client.send(msg.encode("utf-8")) # 发送信息到服务器
	data = client.recv(1024) # 接收服务器发过来的信息
	print('client_recv:', data.decode()) # 打印服务器发来的信息
	
	# f.write(data) # 接收的时候也是有限制的,不能一次性全部收过来
	# f.flush()
	
client.close() # 最后,关闭客户端

2、服务器
服务器先启动监听,等待客户端连接,连接上之后,接收客户端的消息指令,作出响应
服务器实现逻辑流程如下:
1. 生成socket连接对象
2. 监听
3. 等待客户端连接
4. 接收客户端消息/指令
5. 作出回应
6. 关闭socket

# Author: Mr.Xue
# 2019.10.29
#socket_server.py

import socket, os

server = socket.socket() # 声明socket类型,同时生成socket连接对象
server.bind(('localhost', 6961)) # 绑定要监听端口
server.listen(3) # 监听
print("我要等电话了")
while True:
	conn, addr = server.accept() # 等待电话打进来
	# conn就是客户端连过来而在服务器端为其生成的一个连接实例
	print(conn, addr)
	print("电话来了")
	while True:
		data = conn.recv(1024) # 等待数据过来并接收
		if not data: # 如果没有数据,说明有一个客户端离线
			print("lost a link...")
			break
		print("server_recv: ", data.decode()) # 打印接收到的数据
		conn.send(data.upper()) # 将接收到的数据转换成大写发回给客户端

		# 2.接收cmd命令并执行,将结果返回
		# res = os.popen(data).read()
		# conn.send(res)

		# 3.打开本地文件,发送出去
		# f = open("test.avi")
		# data = f.read()
		# conn.send(data) # 只能发送一下部分
		# conn.sendall(data) # 全部发送
server.close() # 关闭服务器

3、运行结果
现在客户端和服务器的代码都完成了,来测试一下,先运行服务器

xue@xue-MacBookAir:~/python_learn$ python3 socket_server.py 
我要等电话了

现在服务器已经启动,代码运行到accept()就阻塞了,等待客户端连接,现在启动客户端

客户端:

xue@xue-MacBookAir:~/python_learn$ python3 socket_client.py 
>>

服务器:

xue@xue-MacBookAir:~/python_learn$ python3 socket_server.py 
我要等电话了
<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6961), raddr=('127.0.0.1', 38096)> ('127.0.0.1', 38096)
电话来了

客户端等待用户输入内容,服务器从accept()处现在运行到了conn.recv(1024)处,等待接收数据,现在客户端输入数据并发送

客户端:

xue@xue-MacBookAir:~/python_learn$ python3 socket_client.py 
>>hello
5
client_recv: HELLO
>>

服务器:

xue@xue-MacBookAir:~/python_learn$ python3 socket_server.py 
我要等电话了
<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6961), raddr=('127.0.0.1', 38096)> ('127.0.0.1', 38096)
电话来了
server_recv:  hello

客户端成功发送hello给服务器,服务器接收到之后将其转换成大写又发回给客户端,又等待客户端发数据,形成循环

4、总结
上述内容已经实现了客户端和服务器之间的交互通信,但是还是存在不足,只能实现一对一的通信,另一个客户端请求连接服务器并且发送消息,只能等到第一个客户端断开连接之后才可以

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值