TCP编程

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

由于TCP连接具有安全可靠的特性,所以TCP应用更为广泛。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。例如,当我们在浏览器中访问明日学院网站时,我们自己的计算机就是客户端,浏览器会主动向明日学院的服务器发起连接。如果一切顺利,明日学院的服务器接收了我们的连接,一个TCP连接就建立起来了,后面的通信就是发送网页内容了。

1 创建TCP服务器

创建TCP服务器的过程,类似于生活中接听电话的过程。如果要接听别人的来电,首先需要购买一部手机,然后安装手机卡。接下来,设置手机为接听状态,最后静等对方来电。

如同上面的接听电话过程一样,在程序中,如果想要完成一个TCP服务器的功能,需要的流程如下:

l 使用socket()创建一个套接字

l 使用bind()绑定IP和port

l 使用listen()使套接字变为可被动连接

l 使用accept()等待客户端的连接

l 使用recv/send()接收发送数据

实例01 服务器向浏览器发送"Hello World"

例如,使用socket模块,通过客户端浏览器向本地服务器(IP地址为127.0.0.1)发起请求,服务器接到请求,向浏览器发送"Hello World"。具体代码如下:

-*- coding:utf-8 -*-

import socket # 导入socket模块

host = '127.0.0.1' # 主机IP

port = 8080 # 端口号

web = socket.socket() # 创建socket对象

web.bind((host,port)) # 绑定端口

web.listen(5) # 设置最多连接数

print ('服务器等待客户端连接...')

开启死循环

while True:

conn,addr = web.accept() # 建立客户端连接

data = conn.recv(1024) # 获取客户端请求数据

print(data) # 打印接收到的数据

conn.sendall(b'HTTP/1.1 200 OK\r\n\r\nHello World') # 向客户端发送数据

conn.close() # 关闭连接

运行结果如图7所示。然后打开谷歌浏览器,输入网址:127.0.0.1:8080(服务器IP地址是127.0.0.1,端口号是8080),成功连接服务器以后,浏览器显示"Hello World"。运行结果如图8所示。

图7 服务器接收到的请求

图8 客户端接到的响应

2 创建TCP客户端

TCP的客户端要比服务器简单很多,如果说服务器是需要自己买手机、插手机卡、设置铃声、等待别人打电话流程的话,那么客户端就只需要找一个电话亭,拿起电话拨打即可,流程要少很多。

实例02 客户端向服务器发送和接收信息

在实例01中,我们使用浏览器作为客户端接收数据,下面,创建一个TCP客户端,通过该客户端向服务器发送和接收消息。创建一个client.py文件,具体代码如下:

import socket # 导入socket模块

s= socket.socket() # 创建TCP/IP套接字

host = '127.0.0.1' # 获取主机地址

port = 8080 # 设置端口号

s.connect((host,port)) # 主动初始化TCP服务器连接

send_data = input("请输入要发送的数据:") # 提示用户输入数据

s.send(send_data.encode()) # 发送TCP数据

接收对方发送过来的数据,最大接收1024个字节

recvData = s.recv(1024).decode()

print('接收到的数据为:',recvData)

关闭套接字

s.close()

打开2个cmd命令行窗口,先运行实例01中的server.py文件,然后运行client.py文件。接着,在client.py窗口输入"hi",此时server.py窗口会接收到消息,并且发送"Hello World"。运行结果如图9所示。

图9 客户端和服务器通信效果

3 执行TCP服务器和客户端

在上面的例子中,我们设置了一个服务器和一个客户端,并且实现了客户端和服务器之间的通信。根据服务器和客户端的执行流程,可以总结出TCP客户端和服务器的通信模型,如图10所示。

实例03 制作简易聊天窗口

既然客户端和服务器可以使用Socket进行通信,那么,客户端就可以向服务器发送文字,服务器接到消息后,显示消息内容并且输入文字返回给客户端。客户接收到响应,显示该文字,然后继续向服务器发送消息。这样,就可以实现一个简易的聊天窗口。当有一方输入"byebye"时,则退出系统,中断聊天。可以根据如下步骤实现该功能。

图10 TCP通信模型

(1)创建server.py文件,作为服务器程序,具体代码如下:

import socket # 导入socket模块

host = socket.gethostname() # 获取主机地址

port = 12345 # 设置端口号

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 创建TCP/IP套接字

s.bind((host,port)) # 绑定地址(host,port)到套接字

s.listen(1) # 设置最多连接数量

sock,addr = s.accept() # 被动接收TCP客户端连接

print('连接已经建立')

info = sock.recv(1024).decode() # 接收客户端数据

while info != 'byebye': # 判断是否退出

if info :

print('接收到的内容:'+info)

send_data = input('输入发送内容:') # 发送消息

sock.send(send_data.encode()) # 发送TCP数据

if send_data =='byebye': # 如果发送byebye,则退出

break

info = sock.recv(1024).decode() # 接收客户端数据

sock.close() # 关闭客户端套接字

s.close() # 关闭服务器套接字

(2)创建client.py文件,作为客户端程序,具体代码如下:

import socket # 导入socket模块

s= socket.socket() # 创建TCP/IP套接字

host = socket.gethostname() # 获取主机地址

port = 12345 # 设置端口号

s.connect((host,port)) # 主动初始化TCP服务器连接

print('已连接')

info = ''

while info != 'byebye': # 判断是否退出

send_data=input('输入发送内容:') # 输入内容

s.send(send_data.encode()) # 发送TCP数据

if send_data =='byebye': # 判断是否退出

break

info = s.recv(1024).decode() # 接收服务器数据

print('接收到的内容:'+info)

s.close() # 关闭套接字

打开2个cmd命令行窗口,分别运行server.py和client.py文件,如图11所示。

图11 服务器和客户端建立连接

接下来,在client.py窗口中,输入"土豆土豆,我是地瓜,收到请回答。over",然后按下<Enter>键。此时,在server.py窗口中将显示client.py窗口发送的消息,并提示server.py窗口输入发送内容,如图12所示。

图12 发送消息

当输入"byebye"时,结束对话,如图13所示。

图13 关闭对话

相关推荐
Koi慢热2 分钟前
路由基础(全)
linux·网络·网络协议·安全
学习前端的小z4 分钟前
【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
开发语言·前端·javascript
神仙别闹11 分钟前
基于C#和Sql Server 2008实现的(WinForm)订单生成系统
开发语言·c#
XINGTECODE12 分钟前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
天天扭码18 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶18 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺23 分钟前
Spring Boot框架Starter组件整理
java·spring boot·后端
zwjapple29 分钟前
typescript里面正则的使用
开发语言·javascript·正则表达式
小五Five30 分钟前
TypeScript项目中Axios的封装
开发语言·前端·javascript
小曲程序30 分钟前
vue3 封装request请求
java·前端·typescript·vue