Python Socket通信的实现
Python Socket通信的实现
一、Socket通信简介
-
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
-
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
-
Socket的英文原义是“孔”或“插座”。作为通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
-
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
二、代码实现
服务端实现
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 19-1-16 上午8:22
# @Author : Fang
# @E-mail : fangrongxuan@163.com
# @Site :
# @File : html_socket.py
# @Software: PyCharm
import socket
# 1、创建服务端的socket对象
sk = socket.socket()
# 2、绑定一个ip和端口
sk.bind(("127.0.0.1",8888))
# 3、服务器端一直监听是否有客户端进行连接
sk.listen(5)
while 1:
# 4、如果有客户端进行连接、则接受客户端的连接
conn,addr = sk.accept() # 返回客户端socket通信对象和客户端的ip
# 5、客户端与服务端进行通信
rev_data = conn.recv(1024)
print('服务端收到客户端发来的消息:%s' % (rev_data.decode('GB2312')))
# 6、服务端给客户端回消息
conn.send(b"HTTP/1.1 200 OK \r\n\r\n") #http协议
show_str = "<h1> 这短短的一生,我们最终都会失去,你不妨大胆一些。爱一个人,攀一座山,追一个梦,加油 !!!</h1>"
conn.send(show_str.encode('GB2312'))
# 7、关闭socket对象
conn.close()
客户端实现
客户端我们可以自己写,也可以直接使用浏览器,即B/S架构
用浏览器访问 http://127.0.0.1:8000
接下来我们自己写一个客户端,用来互相收发数据
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 19-1-16 下午2:56
# @Author : Fang
# @E-mail : fangrongxuan@163.com
# @Site :
# @File : scoket_client.py
# @Software: PyCharm
import socket
# 1、创建socket通信对象
clientSocket = socket.socket()
# 2、使用正确的ip和端口去链接服务器
clientSocket.connect(("127.0.0.1",8888))
# 3、客户端与服务器端进行通信
# 给socket服务器发送信息
send_data = "你拼命赚钱的样子虽然有些狼狈。但是自己靠自己的样子真的很美!加油"
clientSocket.send(send_data.encode('GB2312'))
# 接收服务器的响应(服务器回复的消息)
recvData = clientSocket.recv(1024).decode('GB2312')
print('客户端收到服务器回复的消息:%s' % (recvData))
# 4、关闭socket对象
clientSocket.close()
运行一下
运行服务端
运行客户端,客户端接收到服务端发来的数据了
再看服务端也接收到客户端的数据了
总结
B/S架构很方便,是对C/S架构的一种变化或者改进的架构。相对于C/S架构来说不需要安装额外的客户端,也就不存在客户端的升级,少了很多麻烦
当然不要被带偏了,刚开始只是想偷懒不写客户端,所以思考用浏览器代替客户端,当然这不是B/S架构以及socket的正确用法,本文所写的不过沧海一粟,通过抛砖引玉进一步深入地了解socket和B/S架构,共勉