python学习笔记2:socket网络编程

文章目录

  • 一、socket是什么?
  • 二、如何使用socket进行网络编程
    • 1.Socket的工作流程
      • 以TCP协议为例:
    • 2.socket循环通信代码
        • 服务端 server1.py
        • 客户端 client1.py
  • 总结


一、socket是什么?

Socket又称为套接字,它是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
当我们使用不同的协议进行通信时就得使用不同的接口,还得处理不同协议的各种细节,这就增加了开发的难度,软件也不易于扩展(就像我们开发一套公司管理系统一样,报账、会议预定、请假等功能不需要单独写系统,而是一个系统上多个功能接口,不需要知道每个功能如何去实现的)。于是UNIX BSD就发明了socket这种东西,socket屏蔽了各个协议的通信细节,使得程序员无需关注协议本身,直接使用socket提供的接口来进行互联的不同主机间的进程的通信。这就好比操作系统给我们提供了使用底层硬件功能的系统调用,通过系统调用我们可以方便的使用磁盘(文件操作),使用内存,而无需自己去进行磁盘读写,内存管理。socket其实也是一样的东西,就是提供了tcp/ip协议的抽象,对外提供了一套接口,通过过这个接口就可以统一、方便的使用tcp/ip协议的功能了。

其实站在你的角度上看,socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。也有人将socket说成ip+port,因为ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序。 所以我们只要确立了ip和port就能找到一个应用程序,并且使用socket模块来与之通信。

二、如何使用socket进行网络编程

1.Socket的工作流程

服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束

以TCP协议为例:

python学习笔记2:socket网络编程_第1张图片

2.socket循环通信代码

代码如下(示例):

服务端 server1.py
from socket import AF_INET, SOCK_STREAM, socket
#导入sockert模块
phone = socket(AF_INET, SOCK_STREAM)
# 获取tcp/ip套接字
phone.bind(('127.0.0.1', 8080))
#绑定(主机,端口号)到套接字
phone.listen(5)
# 同一时刻可以有5个请求,  注意虽然只可以有五个请求但是可以有N多个链接。 开机。
while 1:
    conn, client_addr = phone.accept()
    #接收 发出连接请求的客户端
    print(conn, client_addr, sep='\n')
    #打印 客户端信息

    while 1:
        try:
            from_client_data = conn.recv(1024)
            #接受客户端数据
            print(from_client_data.decode('utf-8'))
            #解码打印
            server_send=input("请输入要回复的内容>>>")
            server_send=server_send.encode('utf-8')
            #输入内容 编码
            conn.send(server_send)
            #发送给客户端
        except:
            break
            #如果失败了就结束内循环

conn.close()
phone.close()

客户端 client1.py
import socket
#导入全部sockert模块
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('127.0.0.1',8080))
#连接服务端

while 1:
  client_data = input('>>> ')
  phone.send(client_data.encode('utf-8'))
  #发送编码数据
  if client_data == 'q':break
  #设置通讯停止

  from_server_data = phone.recv(1024)
  print(from_server_data.decode('utf-8'))
  #接受数据解码输出

phone.close()

测试:
客户端先输入 但是需要先运行服务端
在这里插入图片描述
服务端
在这里插入图片描述


总结

import socket
socket.socket(socket_family,socket_type,protocal=0)
# socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,默认值为 0

# 获取tcp/ip套接字
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 获取udp/ip套接字
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 由于 socket 模块中有太多的属性。我们在这里破例使用了'from module import *'语句。使用 'from socket import *',我们就把 socket 模块里的所有属性都带到我们的命名空间里了,这样能 大幅减短我们的代码。
# 例如
tcpSock = socket(AF_INET, SOCK_STREAM)

你可能感兴趣的:(网络,学习,服务器)