[Python]网络编程基础

发布时间:2023-04-26 11:30

客户端/服务器网络编程

在服务器响应客户端请求之前,必须进行一些初步的设置流程来为之后的工作做准备。首先会创建一个通信端点,它能够使服务器监听请求。一旦一个通信端点已经建立,监听服务器就可以进入无限循环中,等待客户端的连接并响应它们的请求。

客户端所需要做的只是创建它的单一通信端点,然后建立一个到服务器的连接。然后客户端就可以发出请求,该请求包括任何必要的数据交换。一旦请求被服务器处理,且客户端收到结果或某种确认信息,此次通信就会被终止。

套接字:通信端点

套接字是计算机网络数据结构,在任何类型的通信开始之前,网络应用程序必须先创建套接字。

一般而言,套接字是为发送和接收数据而构建的内部端点。单个网络将具有两个套接字,每个通信设备或程序一个。这些套接字是IP地址和端口的组合。根据所使用的端口号,单个设备可以具有n个插槽。不同的端口可用于不同类型的协议。

python中的网络编程

要使用Python实现Socket编程,需要导入socket模块或框架。该模块由创建套接字并帮助它们彼此关联所需的内置方法组成。

一些重要的方法如下:

Methods 描述
socket.socket() 用于创建套接字(服务器和客户端都需要创建套接字)
socket.accept() 用于接受连接。它返回一对值(conn,address),其中conn是用于发送或接收数据的新套接字对象,而address是连接另一端存在的套接字的地址
socket.bind() 用于绑定到指定为参数的地址
socket.close() 用于将套接字标记为已关闭
socket.connect() 用于连接到指定为参数的远程地址
socket.listen() 使服务器能够接受连接

TCP服务器/客户端

服务端

#! /usr/bin/env python

from socket import *

HOST = ''	//标记bind方法,表示可以使用任何可用地址
PORT = 39543
BUFSIZE = 1024	//缓冲区大小
ADDR = (HOST,PORT)

sersock = socket(AF_INET,SOCK_STREAM)	//创建服务器套接字
sersock.bind(ADDR)	//套接字与地址绑定
sersock.listen(5)	//监听连接

while True:
    print('waiting for connection ---')
    clisock,addr = sersock.accept()	//接受客户端连接
    print('--- connected from :',addr)
    
    while True:
        data = clisock.recv(BUFSIZE).decode()	//对话接收
        if not data:
            break
        clisock.send(data.encode())   //对话发送
    clisock.close()
sersock.close	//关闭服务端套接字

客户端

#! /usr/bin/env python

from socket import *

HOST = 'localhost'
PORT = 39543
BUFSIZE = 1024
ADDR = (HOST,PORT)

clisock = socket(AF_INET,SOCK_STREAM)
clisock.connect(ADDR)

while True:
    data = input('>')
    if not data:
        break
    clisock.send(data.encode())
    data = clisock.recv(BUFSIZE).decode()
    if not data:
        break
    print(data)
clisock.close()

执行效果:

客户端:

>aaa
aaa

服务端:

waiting for connection ---
--- connected from : ('127.0.0.1', 8370)

接下来我们对这个基础的演示程序进行一个改造,将它变成一个简易的聊天工具:

半双工聊天器

服务端

#! /usr/bin/env python

from socket import *

HOST = ''
PORT = 39543
BUFSIZE = 1024
ADDR = (HOST,PORT)

sersock = socket(AF_INET,SOCK_STREAM)
sersock.bind(ADDR)
sersock.listen(5)

print('waiting for connection ---')
clisock, addr = sersock.accept()
print('--- connected from :', addr)
while True:
    data = clisock.recv(BUFSIZE).decode()
    print('>' + data)
    resp = input('+')
    resp = '+'+resp
    if not resp:
        break
    clisock.send(resp.encode())
clisock.close()
sersock.close()

客户端

#! /usr/bin/env python

from socket import *

HOST = 'localhost'
PORT = 39543
BUFSIZE = 1024
ADDR = (HOST,PORT)

clisock = socket(AF_INET,SOCK_STREAM)
clisock.connect(ADDR)

while True:
    data = input('>')
    if not data:
        break
    clisock.send(data.encode())
    data = clisock.recv(BUFSIZE).decode()
    if not data:
        break
    print(data)
clisock.close()

这样就可以愉快的聊天了

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号