Python线程式“对讲机”:socket网络编程、线程

Python线程式“对讲机”:socket网络编程、线程

先看一下程序的运行效果:
在这里插入图片描述

一、什么是socket?

socket是用于在两个基于TCP/IP协议的应用程序之间相互复通信。我们平时用的QQ,微信,等社交软件,基本都与socket编程有关。
在这里插入图片描述
上图是我们平时访问浏览器时的流程图,但引入本文的,就是服务器客户端之间的爱情瓜葛,而socket编程这个月老就是实现这俩人的交流。

1、在看这俩人甜蜜时,我们要学习几个概念

本段摘自:【socket笔记】TCP、UDP通信总结

  • IP地址(InternetProtocolAddress):是指互联网协议地址,又译为 网际协议地址。IP地址被用来给Internet上的电脑一个编号。我们可以把“个人电脑”比作“一台电话”,那么“IP地址”就相当于“电话号码”。若计算机1知道计算机2的IP地址,则计算机1就能访问计算机2。
  • 端口:端口使用16bit进行编号,即其范围为: 0-65536。但 0-1024 的端口一般由系统分配给计算机特定的服务接口。
  • 协议(Protocol):是通信双方进行数据交互的一种约定。
  • 协议族:是多个协议的统称。比如我们的TCP/IP协议族,其不仅仅是TCP协议、IP协议,而是多个协议的集合,其包含IP、TCP、UDP、FTP、SMTP等协议。

2、TCP协议
TCP(Transmission Control Protocol 传输控制协议):是一种面向连接的、可靠的、基于字节流的传输层通信协议,数据可以准确发送,数据丢失会重发。

  • TCP通信的特点:TCP的三次与四次对话

连接:

客户端:服务器!我来造作了
服务器:客户端!我给你开门
客户端:服务器!谢谢

断开:

客户端:服务器!我要走了
服务器:客户端!我去给你开门
服务器:客户端!门开好了,可以滚了
客户端:服务器!诶,好嘞,你等的

再他们互相叫名的过程中,其实就是一个互相确定传输的过程:
在连接时TCP有如下过程:
在这里插入图片描述
在断开时有如下过程:
在这里插入图片描述
3、UDP协议
UDP(User Datagram Protocol, 用户数据报协议):是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,可以保证通讯效率,传输延时小。例如视频聊天应用中用的就是UDP协议,这样可以保证及时丢失少量数据,视频的显示也不受很大影响。

二、socket编程

1、服务器端

  • 将接受功能单独放入一个线程,让此线程单独运作,不让他阻塞发送。
  • 代码:
import socket
import threading
import sys

def server_lunch():
    HostPort = ('127.0.0.1', 9999)#设定主机名,端口
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#参数
    s.bind(HostPort)#绑定IP接口
    s.listen(20)#开始监听
    conn, addr = s.accept()#开始握手
    print('Connecting by : ', addr)#显示链接的administered
    welcome = "···weclome  to -LEAGUES OF SOPHON-···"
    conn.send(welcome.encode('utf8'))#至上欢迎辞
    return conn

def receive(conn):#接收函数
    while True:
        msg = conn.recv(1024).decode('utf8')#接收信息流,并转化编码
        print("clience says:",msg)
        if msg == "exit":
            sys.exit()#退出程序

if __name__ == '__main__':
    conn = server_lunch()#启动服务端
    server_trd = threading.Thread(target=receive , args=(conn,))#开启线程
    server_trd.start()
    while True:#循环输入
        root = input(">>>").strip()
        conn.send(root.encode('utf8'))
        if root == "exit":
            s.close()

2、同理的客服端

import socket
import threading
import sys

def receive(s):#接收函数
    while True:
        msg = s.recv(1024).decode('utf8')
        if msg == "exit":
            sys.exit()
        print ("server says:", msg)

if __name__ == '__main__':
    hostport = ('127.0.0.1', 9999)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(hostport)#连接接口
    print(s.recv(1024).decode())

    clience_trd = threading.Thread(target=receive,args=(s,))#启动接收线程
    clience_trd.start()

    while True:
        user_input = input('>>> ').strip()
        s.send(user_input.encode('utf-8'))
        if user_input == 'quit':
            sys.exit()

运行结果:
在这里插入图片描述
在这里插入图片描述
实在是有趣。

推荐大家阅读一下这两篇文章。Python 网络编程入门——用 Socket 做一个风花雪月服务器Python 进阶必备:线程模块 threading

往后可能去开发一个原始版的QQ,以作为网络编程学习的大作业,亲情期待。

猜你喜欢

转载自blog.csdn.net/weixin_43818177/article/details/105906044