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  : 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架构,共勉

  • 19
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值