基于TCP协议的Socket网络编程( )

本文介绍了如何在Python中使用TCP协议进行Socket网络编程。首先讲解了TCP连接的基本概念,然后展示了客户端如何发起连接并发送HTTP请求,接收并处理服务器响应。接着,解释了with语句的作用和工作原理。最后,详细描述了服务器端如何监听并处理来自客户端的连接,包括创建Socket、绑定端口、监听和接受连接。完整代码示例包括了服务器(server.py)和客户端(client.py)的部分。
摘要由CSDN通过智能技术生成

TCP编程

Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。

今天我们要在Python中,基于TCP协议进行Socket网络编程

客户端

大多数连接都是可靠的TCP连接。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。

举个例子,当我们在浏览器中访问百度时,我们自己的计算机就是客户端,浏览器会主动向百度的服务器发起连接。如果一切顺利,百度的服务器接受了我们的连接,一个TCP连接就建立起来的,后面的通信就是发送网页内容了。


言归正传,如果我们需要进行网络通信,就必须要创建一个基于TCP连接的Socket:

#######################
#########客户端#########
#######################
import socket#导入socket库
import time, threading#导入threading模块
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建一个socket
s.connect(('www.baidu.com', 80))#建立连接

创建Socket时,AF_INET指定使用IPv4协议,如果要用更先进的IPv6,就指定为AF_INET6。SOCK_STREAM指定使用面向流的TCP协议,这样,一个Socket对象就创建成功,但是还没有建立连接。

客户端要主动发起TCP连接,必须知道服务器的IP地址和端口号。百度网站的IP地址可以用域名www.baidu.com自动转换到IP地址,但是怎么知道百度服务器,它作为服务器,提供什么样的服务,端口号就必须固定下来。由于我们想要访问网页,因此百度提供网页服务的服务器必须把端口号固定在80端口,因为80端口是Web服务的标准端口。其他服务都有对应的标准端口号,例如SMTP服务是25端口,FTP服务是21端口,等等。端口号小于1024的是Internet标准服务的端口,端口号大于1024的,可以任意使用。

因此,我们连接百度服务器的代码如下

注意参数是一个tuple(元祖),包含地址和端口号。

建立TCP连接后,我们就可以向百度服务器发送请求,要求返回首页的内容:

s.send(b'GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: close\r\n\r\n')
#发送数据

TCP连接创建的是双向通道,双方都可以同时给对方发数据。但是谁先发谁后发,怎么协调,要根据具体的协议来决定。例如,HTTP协议规定客户端必须先发请求给服务器,服务器收到后才发数据给客户端。

发送的文本格式必须符合HTTP标准,如果格式没问题,接下来就可以接收百度服务器返回的数据了:

#接收数据
buffer = []
while True:
    #每次最多接受1kb
    d = s.recv(1024)#一次最多接受指定的字节数
    if d:
        buffer.append(d)
    else:
        break
data = b''.join(buffer)

接收数据时,调用recv(max)方法,一次最多接收指定的字节数,因此,在一个while循环中反复接收,直到recv()返回空数据,表示接收完毕,退出循环。

当我们接收完数据后,调用close()方法关闭Socket,

# 关闭连接:
s.close()

这样,一次完整的网络通信就结束了;
接下来把接收到数据包括HTTP首部和网页本身,我们只需要把HTTP首部和网页分离一下,把HTTP首部内容打印出来,而接受到的网页内容保存到文件:

header,html = data.split(b'\r\n\r\n',1)  #将HTTP首部和网页分离
print(header.decode('utf-8'))
#把接收的数据写入文件
with open('baidu.html','wb') as f:
    f.write(html);

整体的客户端代码如下

#######################
#########客户端#########
#######################
import socket#导入socket库
import time, threading#导入threading模块
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值