python3 socket网络通信的整个流程

端口+IP能够确定一台电脑上的某一个应用程序

# coding=utf-8
import socket

server = socket.socket()  # 相当于创建了一部电话
ip_port = ('127.0.0.1', 8001)  # 创建一个电话卡, 是元组类型
server.bind(ip_port)  # 插上电话卡
'''
监听着电话,我能监听2个,接到一个电话之后,后面还能有1个人给我打电话,但是后面这1个人都要排队等着,
等着我第一个电话挂掉,再来第3个的时候,第3个人的手机会报错.
这里目前只支持一对一的关系,一个服务端对应一个客户端.
'''
server.listen(2)
# 等着别人给我打电话,打来电话的时候,我就拿到了和对方的这个连线通道conn和对方的电话号码addr
conn, addr = server.accept()  # 阻塞住,一直等到有人连接我,连接之后得到一个元祖,里面是连线通道conn和对方的地址(ip+端口)
print('conn', conn)
print('addr', addr)
while True:
    from_client_msg = conn.recv(1024)  # 服务端必须通过两者之间的连接通道来收消息,接收到的数据消息是bytes类型
    from_client_msg = from_client_msg.decode('utf-8')  # 将接收到的数据消息进行解码
    print("来自客户端的消息:", from_client_msg)
    if from_client_msg == 'bye':
        break
    server_input = input('>>>>:')
    conn.send(server_input.encode('utf-8'))  # 服务端给客户端发送一个bytes类型的消息
    if server_input == 'bye':
        break
conn.close()  # 挂电话
server.close()  # 关手机
test_server.py
# coding=utf-8
import socket

client = socket.socket()  # 创建一个socket对象
server_ip_port = ('127.0.0.1', 8001)  # 服务器端的ip+端口,元组类型
client.connect(server_ip_port)  # 客户端连接服务端

while True:
    client_input = input('>>>>:')
    client.send(client_input.encode('utf-8'))  # 给服务端发送bytes类型的消息
    if client_input == 'bye':
        break
    from_server_msg = client.recv(1024)  # 接收最大为1024B(1K)的消息,
    from_server_msg = from_server_msg.decode('utf-8')

    print('来自服务端的消息:', from_server_msg)  # 打印解码后的消息
    if from_server_msg == 'bye':
        break
client.close()  # 客户端挂电话
test_client.py

注意:先运行server,然后再运行client.

两个小练习:

1.
      server端:接收时间戳时间,转换成格式化时间
        client端:每隔10秒中把时间戳发给server端,time.time()
# coding=utf-8
import socket
import time

server = socket.socket()  # 创建一个socket对象,创建一部电话
ip_port = ('127.0.0.1', 8002)
server.bind(ip_port)  # 插上电话卡
server.listen(2)  # 监听
conn, addr = server.accept()  # 等待接听电话,conn是连接通道,addr是客户端ip+port

while 1:
    from_client_msg = conn.recv(1024)  # 接收时间戳时间
    from_client_msg = time.strftime("%Y-%m-%d %X", time.localtime(int(from_client_msg.decode("utf-8"))))  # 转换成格式化时间
    print("来自客户端的消息:", from_client_msg)
    conn.send("时间戳我已收到".encode("utf-8"))
conn.close()  # 关闭连接,挂电话
server.close()  # 关机
practice1_server.py
# coding:utf-8
import socket
import time

client = socket.socket()  # 创建一个socket对象
ip_port = ('127.0.0.1', 8002)
client.connect(ip_port)  # 连接服务端,打电话给服务端

while 1:
    time.sleep(10)
    client.send(str(int(time.time())).encode("utf-8"))  # 发送时间戳
    from_server_msg = client.recv(1024)  # 接收服务端发来的消息
    print("来自服务端的消息:", from_server_msg.decode("utf-8"))
client.close()  # 关闭连接,挂电话
practice1_client.py

2.  一直对话的程序

      server收一个发一个
      client发一个收一个
# coding:utf-8
import socket

server = socket.socket()
ip_port = ("127.0.0.1", 8003)
server.bind(ip_port)
server.listen(2)
conn, addr = server.accept()

while 1:
    from_client_msg = conn.recv(1024)
    print("来自客户端的消息:", from_client_msg.decode("utf-8"))
    if from_client_msg.decode("utf-8").lower() == "bye":
        break
    send_input = input(">>>: ").strip()
    conn.send(send_input.encode("utf-8"))
    if send_input.lower() == "bye":
        break

conn.close()
server.close()
practice2_server.py
# coding:utf-8
import socket

client = socket.socket()
ip_port = ("127.0.0.1", 8003)
client.connect(ip_port)

while 1:
    send_input = input(">>>: ").strip()
    client.send(send_input.encode("utf-8"))
    if send_input.lower() == "bye":
        break
    from_server_msg = client.recv(1024)
    print("来自服务端的消息:", from_server_msg.decode("utf-8"))
    if from_server_msg.decode("utf-8").lower() == "bye":
        break

client.close()
practice2_client.py

 网络编程 https://www.cnblogs.com/clschao/articles/9593164.html
并发编程的博客目录 https://www.cnblogs.com/clschao/articles/10065920.html
mysql数据库的学习目录 https://www.cnblogs.com/clschao/articles/10065275.html
前端的博客目录 https://www.cnblogs.com/clschao/articles/10073124.html
django的学习目录 https://www.cnblogs.com/clschao/articles/10526431.html

posted on 2019-05-26 16:06  lilyxiaoyy  阅读(273)  评论(0编辑  收藏  举报

返回
顶部