Day26 python tcp基本语法和循环发送消息可退出

时间:2022-01-24 09:46:48

1.基本用法

 Day26 python tcp基本语法和循环发送消息可退出

客户端代码:

import socket

# 产生一个socket对象
sk = socket.socket()
sk.connect( ("127.0.0.1",9000) )

# 发送消息 (发送的是二进制字节流)
sk.send("你好么,我好哟".encode("utf-8"))

# 接受消息 (发送完之后,程序加阻塞,等待服务器回应的数据,最大接受1024个字节)
res = sk.recv(1024)
strvar = res.decode("utf-8")
print(strvar)

# 关闭连接
sk.close()

运行代码:

#客户端先给服务器发送的请求,然后收到服务端的回应代码

#我真的好哟

服务端代码:

# ### socket 服务器
import socket
# 创建一个socket对象
sk = socket.socket()
# 绑定ip和端口(注册网络,让别人找到你)
# "127.0.0.1" 默认本机的ip
sk.bind(  ("127.0.0.1",9000)  )
# 开启监听 (等待别人连接服务器)
sk.listen()

'''
# 建立三次握手,建立连接 , 程序加了阻塞 ,
建立三次握手如果失败,程序不往下执行
'''
conn,addr = sk.accept()
print(conn,addr)
# 最大一次性接受1024个字节.程序再次加了阻塞,没有接收到数据,不会向下执行代码
msg = conn.recv(1024)
# 把字节流恢复成正常的字符串(解析字节流变成字符串)
print(msg.decode("utf-8"))

# 发送给客户端数据
conn.send(" 我真的好哟".encode("utf-8"))
# 执行四次挥手,断开连接
conn.close()
# 关闭socket对象,退还占用的端口号
sk.close()

 运行代码:

#print(conn,addr)

<socket.socket fd=268, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9000), raddr=('127.0.0.1', 5846)> ('127.0.0.1', 5846)

# 建立上次握手之后,收到客户端发来的消息
你好么,我好哟

小结:tcp的基本用法就是:

服务端:1.创建一个套接字对象

    2.bind端口和ip让人可以来连接你

    3.listen 监听,等待人的连接

    4.accept一直阻塞到有人来连接服务器,conn,addr,,客户端连接成功即是建立了三次握手。三次握手失败的话,服务器不会继续执行,会一直阻塞。

    5.处理客户端的请求,recv(1024)

    6.向客户端就行发送数据  conn.send(" 我真的好哟".encode("utf-8"))

    7.执行四次握手断开连接,conn.socket()。

    8.断开服务器的套接字sk.colse()

   

    

都是二进制字节流就行交流的。

客户端:

    1.创建socket对象

    2.连接服务器sk.connect( ("127.0.0.1",9000) ),注意ip和端口元祖的形势。

    3.处理,服务器发送过来的数据,也就是recv,res = sk.recv(1024)

    4.关闭套接字,归还系统端口。socket.close()

2.可以就行循环的tcp通讯

1.循环发送消息可退出

客户端代码:

import socket
sk = socket.socket()
sk.connect( ("127.0.0.1",9001) )

while True:
    strvar = input("请输入您要发送的消息")
    # 发送的数据需要二进制字节流
    sk.send(strvar.encode("utf-8"))
    res = sk.recv(1024)    
    if res == b"q":
        break
    print(res.decode("utf-8"))
    
# 关闭连接
sk.close()
# 一发一收是一对,客户端还是创建套接字、连接服务器(即是三次握手的conncet),发送请求send,接受recv服务器相应的回应。,这次是如果收到服务器发送到的q即是退出连接。
Day26 python tcp基本语法和循环发送消息可退出

 


服务端代码:
# ### 循环发消息
import socket
sk = socket.socket()
# 在网络中注册该主机
sk.bind( ("127.0.0.1",9001) )
# 监听端口
sk.listen()

while True:
    # 建立三次握手
    conn,addr = sk.accept()
    while True:
        res = conn.recv(1024)
        # 把字节流变成原本字符串
        res2 = res.decode("utf-8") 
        print(res2)
        strvar = input("你要发送给客户端什么消息呢?:")
        conn.send(strvar.encode("utf-8"))
        if strvar == "q":
            break

# 执行四次挥手
conn.close()

# 退还系统的9000端口
sk.close()
# 缺点:能就行和一个服务端就行连接,但是只能是一个客户端。
运行代码:
Day26 python tcp基本语法和循环发送消息可退出

 

 
 

 

 

2.