资讯专栏INFORMATION COLUMN

python大佬养成计划----socket实现TCP通信

layman / 2697人阅读

摘要:我们来编写一个简单的服务器程序,它接收客户端连接,回复客户端发来的请求。如果一切顺利,新浪的服务器接受了我们的连接,一个连接就建立起来的,后面的通信就是发送网页内容了。

TCP

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内 [1] 另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

下面是socket实现TCP通信的示意图,我们根据示意图来编写程序

TCP服务端

服务器进程首先要绑定一个端口并监听来自其他客户端的连接。 如果某个客户端连接过来了, 服务器就与该客户端建立Socket连接, 随后的通信就靠这个Socket连接了。

我们来编写一个简单的服务器程序, 它接收客户端连接,回复客户端发来的请求。

import socket
server = socket.socket()
server.bind(("192.168.1.165",8900))
#调用 listen() 方法开始监听端口, 传入的参数指定等待连接的最大数量
server.listen(4)
serObj,address = server.accept()
#当有客户端访问时,实现两边的交流,如果有一方退出,整个程序退出。
#服务器程序通过一个永久循环来接受来自客户端的连接
#这里虽然给出最大连接数为4,但单线程程序也只会响应一个连接
while True:
#建立连接后,服务端等待客户端发送的数据,实现通信
    re_data = serObj.recv(1024).decode("utf-8")
    print("client>>",re_data)
    if re_data == "quit":
        break
    send_data = input("server>>")
    serObj.send(send_data.encode("utf-8"))
    if send_data == "quit":
        break
serObj.close()
server.close()
TCP客户端

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

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

客户端要主动发起TCP连接, 必须知道服务器的IP地址和端口号。

import socket
client = socket.socket()
client.connect(("192.168.1.165",8900))
while True:
    send_data = input("client>>")
    client.send(send_data.encode("utf-8"))
    if send_data == "quit":
        break
    re_data = client.recv(1024).decode("utf-8")
    if re_data == "quit":
        break
    print("server>>",re_data)

client.close()

用一个窗口运行客户端、另一个窗口运行服务端,可以更直观看见效果。
这里我的08_pra.py是服务端程序,09_pra.py是客户端程序

刚建立连接时的示意图

一次通信完成的示意图

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42578.html

相关文章

  • python大佬养成计划----socket实现UDP通信

    摘要:是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对,则是面向无连接的协议。测试结果用两个命令行分别启动服务器和客户端测试开启服务端完成一次通信 UDP TCP是建立可靠连接, 并且通信双方都可以以流的形式发送数据。 相对TCP, UDP则是面向无连接的协议。使用UDP协议时, 不需要建立连接, 只需要知道对方的IP地址和端口号, 就可以直接发数据包。 但是, 能不能到达就不知道...

    Juven 评论0 收藏0
  • python大佬养成计划--协程实现TCP连接

    摘要:协程实现连接在网络通信中,每个连接都必须创建新线程或进程来处理,否则,单线程在处理连接的过程中,无法接受其他客户端的连接。所以我们尝试使用协程来实现服务器对多个客户端的响应。 协程实现TCP连接 在网络通信中,每个连接都必须创建新线程(或进程) 来处理,否则,单线程在处理连接的过程中, 无法接受其他客户端的连接。所以我们尝试使用协程来实现服务器对多个客户端的响应。与单一TCP通信的构架...

    fuchenxuan 评论0 收藏0
  • python大佬养成计划----socket网络编程

    摘要:一个包来了之后,到底是交给浏览器还是,就需要端口号来区分。每个网络程序都向操作系统申请唯一的端口号,这样,两个进程在两台计算机之间建立网络连接就需要各自的地址和各自的端口号。 网络通信的三要素 IP 通信的时候, 双方必须知道对方的标识, 好比发邮件必须知道对方的邮件地址。 互联网上每个计算机的唯一标识就是IP地址, 类似 123.123.123.123 。 IP地址实际上是一个32位...

    phodal 评论0 收藏0
  • python大佬养成计划----进程、线程与多进程

    摘要:在一个进程内部,要同时干多件事,就需要同时运行多个子任务,我们把进程内的这些子任务称为线程。总结一下,多任务的实现方式有三种多进程模式多线程模式多进程多线程模式线程是最小的执行单元,而进程由至少一个线程组成。 进程与线程 很多同学都听说过,现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持多任务的操作系统。 什么叫多任务呢?简单地说,就是操作系统可以同时...

    taowen 评论0 收藏0
  • python大佬养成计划----分布式进程

    摘要:分布式进程在和中,应当优选,因为更稳定,而且,可以分布到多台机器上,而最多只能分布到同一台机器的多个上。由于模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。 分布式进程 在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。 Pytho...

    honmaple 评论0 收藏0

发表评论

0条评论

layman

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<