其他分享
首页 > 其他分享> > tcp3-1

tcp3-1

作者:互联网

TCP代码开发示例,教材3.4节,代码清单3-1

3-1代码功能:

客户端:发送一个消息“Hi There, Server”,接收客户端的响应,打印出来,然后关闭。

服务器:接收客户端发过来的消息,然后发送响应:“Farewell, client”。

import socket
import argparse

功能:一直接收数据直到数据的长度达到length为止

def recvall(sock, length):
# 存放已经接收到的数据
data = b''
# 循环接收剩余长度的数据
while len(data) < length:
more = sock.recv(length - len(data))
# 如果more是空,表明对方已经关闭了连接
if not more:
raise Exception("peer closed.")
data += more
return data

def client(host, port):
'''tcp客户端4个步骤:创建socket,connect,send/recv,close'''
# 创建socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
sock.connect((host, port))
# 接收和发送数据
# send也是能发多少发多少,可能只发一部分数据。
# sock.send(b"Hi There, Server")
sock.sendall(b"Hi There, Server")
# recv函数有数据就返回了,不会等到收到16个字节再返回,因此这个地方有问题
# reply = sock.recv(16)
reply = recvall(sock, 16)
print(reply.decode("utf8"))
# 关闭连接
sock.close()

tcp服务器6个步骤:创建socket,bind,listen,accept,send/recv,close

def server(interface, port):
# 创建socket对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口
sock.bind((interface, port))
# 开始监听
sock.listen(1)
while True:
# 接收客户端连接
csock, addr = sock.accept()
print("received a client from {}".format(addr))
# 获取请求,发送响应
# reqeust = csock.recv(16)
request = recvall(csock, 16)
print("received message: {}".format(request.decode("utf8")))
# csock.send(b'Farewell, client') # 为什么要加b标识,bytes类型
csock.sendall(b'Farewell, client')
# 关闭连接
csock.close()
print("Reply sent, socket closed")

参数解析:创建argparse,添加3个参数,执行解析,使用解析后的参数

def main():
parser = argparse.ArgumentParser(
description="A simeple demo for TCP server/client")
choices = {
"client": client,
"server": server,
}
parser.add_argument("role", choices=choices,
help="the role to play {server | client}")
parser.add_argument(
"host", help="the interface to listen at or the host to connect")
parser.add_argument("-p", type=int, default=1060, help="port number")
args = parser.parse_args()
function = choices[args.role]
function(args.host, args.p)

if name == 'main':
main()

标签:socket,sock,csock,server,tcp3,client,recv
来源: https://www.cnblogs.com/mypf/p/15357925.html