Python网络编程(socket,简单的客户端和服务端)

请添加图片描述

#服务端
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#socket.AF_INET意思是使用的套接字是这个,是基于网络通信,
#socket.SOCK_STREAM意思是基于TCP协议,这整个的意思是基于TCP协议的网络通信
phone.bind(('127.0.0.1',443))#这个是服务器的IP地址及端口号,能够直接定义到这段程序,就是给他生成一个位置
phone.listen(5)#这个地方代表这个最多能够监听多少个请求,其实这个地方相当于一个半链接池
print('-------->')

conn,addr = phone.accept()    #conn代表着和客户端建立的链接,addr代表着客户端的地址#这个过程就是在网络中进行的三次握手完成
#此时服务端可以主动地和客户端发下次

#conn.send('服务端发送消息:你好')

msg = conn.recv(1024)#接受客户端消息  1024代表可以收到多少个字节
print('客户端打来的消息是:',msg)
conn.send('服务端发送消息:你好吗')

conn.close()
phone.close()




#客户端与服务端建立连接需要三次握手
# 第一次,客户端向服务端发出建立连接请求
# 第二次,服务端回应客户端,建立连接成功,服务端此时也发出请求和客户端建立连接
# 第三次,客户端回应同意和服务端建立连接的请求
#TCP协议的洪水攻击的原理
#一个黑客同时向服务端模拟大量的用户请求,此时服务端会对所有的请求进行回应,并发出和客户端建立连接的请求,
# 此时模拟的大量的用户发完请求就跑了,这么做之后,此时这些大量的请求不会给服务器进行回应,
# 而服务端还会一直的去发送和客户端建立连接的请求,从而大量占用服务器资源,直到服务端崩溃
#这个是为了引出一个概念,半链接,半链接就是没有走完三次握手的链接,如果服务端没有收到客户端最后发出的同意建立连接的回应,
# 那么服务端会一直停留到半链接状态

#backlogc称为半链接池,客户端同时会涌进来很多请求,此时服务端响应不过来,响应不过来的请求放到半链接池中,
# 然后服务端从半链接池中取客户端发出的请求

#半链接池对应到程序中的时服务端的phone.listen(5)这个5就是这个半链接池中最多的请求数量,
# 洪水攻击会瞬间把你的半链接池占满,然后服务端就没办法接收到新的请求了;解决办法一个是增加半链接池容纳请求的数量,
# 一个是让服务端不会持续的给一个请求回应,而是规定回应多少次后就断开

#TCP协议之所以说是可靠连接,是因为基于TCP协议,服务端在收到客户端的消息后,服务端会跟客户端发出消息说明收到了,
# 如果服务端不回应,那么客户端会再次发送请求

#所有请求结束之后,关闭连接 进行四次挥手
# 第一次:客户端发出请求,完成了资源的传送
# 第二次:服务端收到请求,回应给客户端
# 第三次:服务端发出断开连接请求
# 第四次:客户端收到请求,发给服务端,然后连接断开
#
#
# 其实是两条线,一条线用于客户端给服务端发请求,一条线是服务端给客户端发请求,三次握手和四次挥手都是基于这两条线进行的
#不一定是客户端发起请求断开连接的,也可能是服务端发起的断开请求

#为什么四次挥手不能变成三步结束
#因为三次握手是不带数据传输的,所以在二三步合成了第二步,而在四次挥手的过程中,可能是携带数据的,
# 就是客户端发出了请求,提出需要资源,发出去之后,请求结束,请求断开
#此时服务端需要把资源发出去,如果直接同意断开,那么就会出现客户端并没有拿到数据,因为链接直接断开了,所以第二步和第三部不能同时进行

#在实际场景中,一般是服务端先提出断开资源的,这么做为了节省服务端的资源
# #客户端
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('192.168.77.185',443))#访问服务端这个IP的程序
phone.send('hello'.encode('utf-8'))#发消息,因为网络协议收发消息都是基于二进制的方式,就是字节的方式去收发的,所以发的时候都要进行编码

data = phone.recv(1024)
print('收到的服务端发来的消息:',data)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhaoXuWen23

你的鼓励是我的动力,持续更新中

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值