| 
                         所有支持网络通信的编程语言都各自提供了一套 socket API,下面以 Python 3 为例,讲解服务器与客户端建立 TCP  通信连接的交互过程: 
  
  
脑海中先对上述过程产生一定印象后,更易于理解下面两节 TCP 服务器与客户端的 Python 实现。 
0x03 TCP 服务器 
- #!/usr/bin/env python3 
 - # -*- coding: utf-8 -*- 
 - #公众号:python学习开发 
 - import socket 
 - import threading 
 - def tcplink(conn, addr): 
 -     print("Accept new connection from %s:%s" % addr) 
 -     conn.send(b"Welcome!n") 
 -     while True: 
 -         conn.send(b"What's your name?") 
 -         data = conn.recv(1024) 
 -         if data == b"exit": 
 -             conn.send(b"Good bye!n") 
 -             break 
 -         conn.send(b"Hello %s!n" % data) 
 -     conn.close() 
 -     print("Connection from %s:%s is closed" % addr) 
 - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
 - s.bind(("127.0.0.1", 6000)) 
 - s.listen(5) 
 - print("Waiting for connection...") 
 - while True: 
 -     conn, addr = s.accept() 
 -     t = threading.Thread(target = tcplink, args = (conn, addr)) 
 -     t.start() 
 
  
    - Line 6:定义一个 tcplink() 函数,第一个 conn 参数为服务器与客户端交互数据的套接字对象,第二个 addr 参数为客户端的 IP  地址与端口号,用二元组 (host, port) 表示。
 
    - Line 8:连接成功后,向客户端发送欢迎信息 b"Welcome!n"。
 
    - Line 9:进入与客户端交互数据的循环阶段。
 
    - Line 10:向客户端发送询问信息 b"What's your name?"。
 
    - Line 11:接收客户端发来的 bytes 对象。
 
    - Line 12:若 bytes 对象为 b"exit",则向客户端发送结束响应信息 b"Good  bye!n",并结束与客户端交互数据的循环阶段。
 
    - Line 15:若 bytes 对象不为 b"exit",则向客户端发送问候响应信息 b"Hello %s!n",其中 %s 是客户端发来的 bytes  对象。
 
    - Line 16:关闭套接字,不再向客户端发送数据。
 
    - Line 19:创建 socket 对象,第一个参数为 socket.AF_INET,代表采用 IPv4 协议用于网络通信,第二个参数为  socket.SOCK_STREAM,代表采用 TCP 协议用于面向连接的网络通信。
 
    - Line 20:向 socket 对象绑定服务器主机地址 (“127.0.0.1”, 6000),即本地主机的 TCP 6000 端口。
 
    - Line 21:开启 socket 对象的监听功能,等待客户端的连接请求。
 
    - Line 24:进入监听客户端连接请求的循环阶段。
 
    - Line 25:接收客户端的连接请求,并获得与客户端交互数据的套接字对象 conn 与客户端的 IP 地址与端口号 addr,其中 addr 为二元组  (host, port)。
 
    - Line 26:利用多线程技术,为每个请求连接的 TCP 客户端创建一个新线程,实现了一台服务器同时与多台客户端进行通信的功能。
 
    - Line 27:开启新线程的活动。
 
 
0x04 TCP 客户端 
- #!/usr/bin/env python3 
 - # -*- coding: utf-8 -*- 
 - #公众号:python学习开发 
 -  
 - import socket 
 - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
 - s.connect(("127.0.0.1", 6000)) 
 - print(s.recv(1024).decode()) 
 - data = "client" 
 - while True: 
 -     if data: 
 -         print(s.recv(1024).decode()) 
 -     data = input("Please input your name: ") 
 -     if not data: 
 -         continue 
 -     s.send(data.encode()) 
 -     print(s.recv(1024).decode()) 
 -     if data == "exit": 
 -         break 
 - s.close() 
 
  
    - Line 5:创建 socket 对象,第一个参数为 socket.AF_INET,代表采用 IPv4 协议用于网络通信,第二个参数为  socket.SOCK_STREAM,代表采用 TCP 协议用于面向连接的网络通信。
 
    - Line 6:向 (“127.0.0.1”, 6000) 主机发起连接请求,即本地主机的 TCP 6000 端口。
 
    - Line 7:连接成功后,接收服务器发来的欢迎信息 b"Welcome!n",并转换为字符串后打印输出。
 
    - Line 9:创建一个非空字符串变量 data,并赋初值为 "client"(只要是非空字符串即可),用于判断是否接收来自服务器发来的询问信息  b"What's your name?"。
 
    - Line 10:进入与服务器交互数据的循环阶段。
 
    - Line 11:当变量 data 非空时,则接收服务器发来的询问信息。
 
    - Line 13:要求用户输入名字。
 
    - Line 14:当用户的输入为空时,则重新开始循环,要求用户重新输入。
 
    - Line 16:当用户的输入非空时,则将字符串转换为 bytes 对象后发送至服务器。
 
    - Line 17:接收服务器的响应数据,并将响应的 bytes 对象转换为字符串后打印输出。
 
    - Line 18:当用户的输入为 "exit" 时,则终止与服务器交互数据的循环阶段,即将关闭套接字。
 
    - Line 21:关闭套接字,不再向服务器发送数据。
 
 
0x05 TCP 进程间通信 
将 TCP 服务器与客户端的脚本分别命名为 tcp_server.py 与 tcp_client.py,然后存至桌面,笔者将在 Windows 10  系统下用 PowerShell 进行演示。 
小贴士:读者进行复现时,要确保本机已安装 Python 3,注意笔者已将默认的启动路径名 python 改为了 python3。                         (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |