发布时间:2023-04-26 11:30
在服务器响应客户端请求之前,必须进行一些初步的设置流程来为之后的工作做准备。首先会创建一个通信端点,它能够使服务器监听请求。一旦一个通信端点已经建立,监听服务器就可以进入无限循环中,等待客户端的连接并响应它们的请求。
客户端所需要做的只是创建它的单一通信端点,然后建立一个到服务器的连接。然后客户端就可以发出请求,该请求包括任何必要的数据交换。一旦请求被服务器处理,且客户端收到结果或某种确认信息,此次通信就会被终止。
套接字是计算机网络数据结构,在任何类型的通信开始之前,网络应用程序必须先创建套接字。
一般而言,套接字是为发送和接收数据而构建的内部端点。单个网络将具有两个套接字,每个通信设备或程序一个。这些套接字是IP地址和端口的组合。根据所使用的端口号,单个设备可以具有n个插槽。不同的端口可用于不同类型的协议。
要使用Python实现Socket编程,需要导入socket模块或框架。该模块由创建套接字并帮助它们彼此关联所需的内置方法组成。
一些重要的方法如下:
Methods | 描述 |
---|---|
socket.socket() | 用于创建套接字(服务器和客户端都需要创建套接字) |
socket.accept() | 用于接受连接。它返回一对值(conn,address),其中conn是用于发送或接收数据的新套接字对象,而address是连接另一端存在的套接字的地址 |
socket.bind() | 用于绑定到指定为参数的地址 |
socket.close() | 用于将套接字标记为已关闭 |
socket.connect() | 用于连接到指定为参数的远程地址 |
socket.listen() | 使服务器能够接受连接 |
#! /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()
这样就可以愉快的聊天了