浅析python-socket编程

1. 什么是socket?

  socket是套接字的英文名称, 我们知道在TCP/IP协议簇体系中,将网络状态分为了应用层、传输层、网络层、物理层等四种状态,而socket是与传输层密切相关的,其主要实现协议为TCP及UDP。传输层实现端到端的通信,因此,每一个传输层连接有两个端点。那么,传输层连接的端点是什么呢?不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口。传输层连接的端点叫做套接字(socket)。根据RFC793的定义:端口号拼接到IP地址就构成了套接字。所谓套接字,实际上是一个通信端点,每个套接字都有一个套接字序号,包括主机的IP地址与一个16位的主机端口号,即形如(主机IP地址:端口号)。例如,如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23)。
总之,套接字Socket=(IP地址:端口号),套接字的表示方法是点分十进制的IP地址后面写上端口号,中间用冒号或逗号隔开。每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定。
套接字可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点。通信时,其中的一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过网络接口卡的传输介质将这段信息发送给另一台主机的Socket中,使这段信息能传送到其他程序中。因此,两个应用程序之间的数据传输要通过套接字来完成。
在网络应用程序设计时,由于TCP/IP的核心内容被封装在操作系统中,如果应用程序要使用TCP/IP,可以通过系统提供的TCP/IP的编程接口来实现。在Windows环境下,网络应用程序编程接口称作Windows Socket。为了支持用户开发面向应用的通信程序,大部分系统都提供了一组基于TCP或者UDP的应用程序编程接口(API),该接口通常以一组函数的形式出现,也称为套接字(Socket)。

1. socket编程基本流程图

     

 2. 使用socket及thread实现多线程聊天通信

  服务器端:

import socket
import threading

HOST, PORT = "localhost", 8020
address = (HOST, PORT)

# socket.AF_INET代表IPV4, socket.AF_INET6代表IPV6
# socket.SOCK_STREAM代表TCP, SOCK_DGRAM代表UDP
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(address)

server.listen()

def handlesock(sock, addr):
    while True:
        data = sock.recv(1024).decode("utf-8")
        if data == "exit":
            break
        print("收到来自客户端[{0}]的消息, 内容是[{1}]".format(addr, data))
        response = input("回复[{0}]:\t".format(addr)).encode("utf8")
        sock.send(response)

while True:
    sock, addr = server.accept()
    cur_sock = threading.Thread(target=handlesock, args=(sock, addr))
    cur_sock.start()

  客户端:

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("localhost", 8020))

while True:
    response = input("回复服务器:").encode("utf8")
    client.send(response)
    if response=="exit":
        break
    data = client.recv(1024).decode("utf8")
    print("收到来自服务器的消息:%s" % data)

client.close()

  解释:

猜你喜欢

转载自www.cnblogs.com/kisun168/p/11221420.html