Python Socket通信的实现

Python Socket通信的实现

一、Socket通信简介

  1. 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

  2. 建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

  3. Socket的英文原义是“孔”或“插座”。作为通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

  4. 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  : [email protected]
# @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

Python Socket通信的实现

接下来我们自己写一个客户端,用来互相收发数据

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 19-1-16 下午2:56
# @Author  : Fang
# @E-mail  : [email protected]
# @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()

运行一下

运行服务端
Python Socket通信的实现

运行客户端,客户端接收到服务端发来的数据了
Python Socket通信的实现

再看服务端也接收到客户端的数据了
Python Socket通信的实现

总结

B/S架构很方便,是对C/S架构的一种变化或者改进的架构。相对于C/S架构来说不需要安装额外的客户端,也就不存在客户端的升级,少了很多麻烦

当然不要被带偏了,刚开始只是想偷懒不写客户端,所以思考用浏览器代替客户端,当然这不是B/S架构以及socket的正确用法,本文所写的不过沧海一粟,通过抛砖引玉进一步深入地了解socket和B/S架构,共勉