将服务端-客户端的连接比作双方打电话的过程

2019-07-24

一.客户端

主动的一方:

客户端实例化一个socket对象--> 主动像服务端发送连接请求--> (服务端接受请求后即可进行数据传输--> )请求成功后发送信息--> (服务端收到数据信息后反馈一个数据信息给客户端,确认操作成功--> )关闭进程

####

——手机通话过程

买手机——>打电话——>说话(发信息)——>听对面说话(收信息)——>沟通完成后挂电话

import socket

#买手机  --  套接字家族 | 端口协议
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #直接打电话 连接服务端 -- 给一个地址- ip | 端口号
phone.connect(('127.0.0.1',1000)) #接通电话后发信息
phone.send('hello'.encode('utf-8')) #接收反馈信息 指定一次接收的量
data = phone.recv(100)
print('信息为: ',data) #关机
phone.close()

二.服务端

被动的一方:

实例化一个socket对象--> *设置一个监听地址(提供一台电脑的唯一标识—ip+端口号)*-->*设置最大监听数量*-->

接受客户端来的一个连接请求--> 连接成功后接收客户端发来的信息--> 发送反馈信息给客户端--> 关闭该连接请求(可能不止一个连接请求)--> 没有连接请求后关闭进程

####

——手机通话过程

买电话——>*买一张电话卡(唯一一台设备)【提供给客户端一个地址来连接服务端】*——>*开机(处于监听状态,有一个最大监听数量)*——>

接一个电话——>接收到对方的信息——>回复一个信息——>打完电话后挂断电话——>关机(不再监听)

import socket

#买手机  --  套接字家族 | 端口协议
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买电话卡 -- 监听一个地址- ip | 端口号
phone.bind(('127.0.0.1',1000)) #开机 指定监听的最大数量 **backlog -- 半连接池**所有的电话均在其中等待
phone.listen(5) #等电话-接电话 电话接通后会得到(sock--一个socket对象, addr--客户端地址)
#socket对象 | 客户端地址
link, addr = phone.accept() # **从backlog中拿出一个电话接通**
#print('socket对象为:',link)
#print('客户端地址为:',addr)
#—>>
#socket对象为: <socket.socket fd=628, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 1000), raddr=('127.0.0.1', 64538)>
#客户端地址为: ('127.0.0.1', 64538)
#电话接通后接收信息  指定一次接收信息的数量
data = link.recv(100)
print('信息为: ',data) #接收到信息后,反馈给client端一个信息,以告诉他已成功接收
link.send(data) #完成一切操作后关掉link,再关机
link.close()
phone.close()

上述代码互相接发一次,需改进实现多次接发信息

并且只连接一次客户端,对于半连接池中的连接请求信息不再同意连接,这个问题同样需要解决

三.优化——多次接发信息以及多次连接用户

客户端:

import socket

#买手机  --  套接字家族 | 端口协议
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #直接打电话 连接服务端 -- 给一个地址- ip | 端口号
phone.connect(('127.0.0.1',1001))
#实现多次发送信息
while True:
#自定义一条信息
msg = input('输入一条信息:')
#若信息为空,会导致程序卡死,用if判断跳过此情况
if not msg:
continue
# 接通电话后发信息
phone.send(msg.encode('utf-8'))
print('向服务端发送信息:',msg)
# #接收完整信息
# accept = 0
# server_accept = len(msg)
#接收反馈信息 指定一次接收的量
data = phone.recv(10)
print('成功接收到服务端反馈信息 ')
#关机
phone.close()

服务端:

import socket

#买手机  --  套接字家族 | 端口协议
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买电话卡 -- 监听一个地址- ip | 端口号
phone.bind(('127.0.0.1',1001)) #开机 指定监听的最大数量 **backlog -- 半连接池**所有的电话均在其中等待
phone.listen(5)
#使得服务端完成一次连接后可继续和第二人连接,多次accept
while True:
#等电话-接电话 电话接通后会得到(return sock, addr) accept() -> (socket object, address info)
#tcp链接 | 客户端地址?
print('等待连接')
link, addr = phone.accept() # **从backlog中拿出一个电话接通**
#多次接发信息  
while True:
#当一个客户端完成通信后客户端主动断开时会导致服务器抛出异常
try:
#电话接通后接收信息 指定一次接收信息的数量
data = link.recv(10)
print('接受到客户端信息为: ',data)
#接收到信息后,反馈给client端一个信息,以告诉他已成功接收
link.send(data)
print('成功向客户端发送一个反馈信息')
except Exception:
break
#完成一切操作后关掉link,再关机
link.close()
phone.close()

四.总结——简化

服务端:

1 ss = socket() #创建服务器套接字
2 ss.bind() #把地址绑定到套接字
3 ss.listen() #监听链接
4 inf_loop: #服务器无限循环
5 cs = ss.accept() #接受客户端链接
6 comm_loop: #通讯循环
7 cs.recv()/cs.send() #对话(接收与发送)
8 cs.close() #关闭客户端套接字
9 ss.close() #关闭服务器套接字(可选)

客户端:

1 cs = socket()    # 创建客户套接字
2 cs.connect() # 尝试连接服务器
3 comm_loop: # 通讯循环
4 cs.send()/cs.recv() # 对话(发送/接收)
5 cs.close() # 关闭客户套接字

网络编程[第一篇]基于tcp协议的套接字编程的更多相关文章

  1. 网络编程[第二篇]基于udp协议的套接字编程

    udp协议下的套接字编程 一.udp是无链接的    不可靠的 而上篇的tcp协议是可靠的,会有反馈信息来确认信息交换的完成与否 基于udp协议写成的服务端与客户端,各司其职,不管对方是否接收到信息, ...

  2. 网络编程之TCP三次握手与四次挥手、基于TCP协议的套接字编程

    目录 TCP三次握手和四次挥手 背景描述 常用的熟知端口号 TCP概述 TCP连接的建立(三次握手) TCP四次挥手 如果已建立连接,客户端突然断开,会怎么办呢? 基于TCP协议的套接字编程 什么是S ...

  3. 基于TCP协议的套接字编程

    06.26自我总结 1.关于Socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在 ...

  4. python 之 网络编程(基于TCP协议的套接字通信操作)

    第八章网络编程 8.1 基于TCP协议的套接字通信 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连 ...

  5. 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现

    一.客户端/服务器架构(C/S架构)                                                即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...

  6. 网络编程(二)--TCP协议、基于tcp协议的套接字socket

    一.TCP协议(Transmission Control Protocol 传输控制协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会 ...

  7. 网络编程(二)——TCP协议、基于tcp协议的套接字socket

    TCP协议与基于tcp协议的套接字socket 一.TCP协议(流式协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的 ...

  8. [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序]

    [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序] 为何学习socket套接字一定要先学习互联网协议: 1.首先:要想开发一款自己的C/S架构软件,就必须掌握socket ...

  9. 网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket

    目录 基于UDP协议的套接字编程 UDP套接字简单示例 服务端 客户端 基于socketserver实现并发的socket 基于TCP协议 server类 request类 继承关系 服务端 客户端1 ...

随机推荐

  1. vue-上拉加载、下拉刷新组件

    vue在移动端开发过程中,上拉加载.下拉刷新是页面的基本需求,现在给大家介绍一种基于touch事件封装的刷新组件. 组件支持传参.传递事件.请求成功异步回调.上拉与触底触发加载或刷新. 父子组件间的通 ...

  2. HDU 1402 A * B Problem Plus ——(大数乘法,FFT)

    因为刚学fft,想拿这题练练手,结果WA了个爽= =. 总结几点犯的错误: 1.要注意处理前导零的问题. 2.一定要注意数组大小的问题.(前一个fft的题因为没用到b数组,所以b就没管,这里使用了b数 ...

  3. [WEB安全]Dirsearch工具命令

    下载项目,并打开 ┌─[root@kali]─[/kali] └──╼ #git clone https://github.com/maurosoria/dirsearch ┌─[root@kali] ...

  4. 缓冲区 cin() getline() getchar()

    ; } 只输入了一行abc, 然后回车后就输出一行abc, 一行空 这是因为cin在缓冲区里丢下的\n 给后面的getline()当成输入结束的标志了 二.getline(cin, str) 输入结束 ...

  5. 2018-2019-2 20165222《网络对抗技术》Exp9 Web安全基础

    1.实践过程记录 1.字符串型注入. 2.整数型注入 3.注入语句查看其他内容 4.xss是一种漏洞,这种漏洞允许用户输入脚本并且浏览器提交的时候不加编码.这种东西是最为流行并且有害的web应用的问题 ...

  6. ubuntu虚拟机安装及vim配置问题(转载)

    virtual box虚拟机Ubuntu系统安装及共享文件夹建立 https://blog.csdn.net/qq_27905767/article/details/82106753 Linux超全v ...

  7. HTML中调用带有SoapHeader头的WebService的两种方法

    第一种: function CallWebMethodWithHeader() { var soapXML = "<soap:Envelope xmlns:xsi='http://ww ...

  8. laravel不同用户对应的同名的session是独立的

    laravel不同用户对应的同名的session是独立的 一.总结 一句话总结: laravel中 不同用户会根据不同的laravel_session从而将session存在不同的session文件里 ...

  9. boost 线程库

    http://www.boost.org/ Boost的安装 step1.从www.boost.org下载boost库 step2 在 tools\build\jam_src目录下 运行build.b ...

  10. vue-resource在vuecli3中请求headers修改

    this.$resource.delete({ user_code: Cookie.get("empid"), date: date, file_name: file_name } ...