socket编程

计算机网络基础

网络通信的三要素

IP:IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
端口:端口分为物理端口和网络端口,在socket编程中,我们通常值的是网络端口。
计算机中执行的每个程序都是一个进程,每个进程都对应一个端口号,且这个端口号是唯一的。
协议:网络协议分为TCP(传输控制协议)和UDP(用户数据报传输协议)。这里的TCP和UDP协议的具体实施细节都被封装在socket中。

网络通信的基本模型

我们通常见到的都是(cs模型)即客户端和服务端模型。

socket基础

socket一些简易操作
import socket
print(socket.gethostname())  #获取当前主机名称

print(socket.gethostbyname('www.baidu.com'))  #根据域名获取主机名

print(socket.gethostbyaddr('114.114.114.114'))  #根据IP 获取主机名
print(socket.getaddrinfo('www.xunlei.com',80))

socket编程

在这里我们以TCP模型为例来进行编程。
在这里插入图片描述

服务端
import socket

server = socket.socket()  #创建一个socket对象
server.bind(('172.25.254.250',9002))  #给服务器对象绑定一个IP和端口
server.listen()  #启动监听,等待来自客户端的连接
socketobj, address = server.accept()  # 与客户端连接,并返回一个连接对象和地址
while True:
    resv = socketobj.recv(1024)  #对服务端接受的信息进行一个限制
    print("server接受到的消息为:%s" %(resv.decode('utf-8')))  #注意当对接受的信息进行打印时,要进行解码
    if resv.decode('utf-8') == "quit":
        break
    info = input('server发送的消息为:')
    socketobj.send(info.encode('utf-8'))  #当对信息进行发送时,要进行编码
socketobj.close()
server.close()
客户端
import socket

client = socket.socket()  #创建一个客户端对象
client.connect(('172.25.254.250',9002))  #对已经启动的服务器通过IP和端口进行连接
while True:
    info = input('client发送的消息为:')
    client.send(info.encode('utf-8'))
    if info == 'quit':
        break
    resv = client.recv(1024)  #接受消息
    print('client接受的消息为:%s' %(resv.decode('utf-8'))
client.close()

注意:当我们的客户端与服务端进行网络通信时,先开启服务端然后在通过客户端对服务端进行连接。
客户端:
在这里插入图片描述
服务端:
在这里插入图片描述

对以上的服务端代码进行升级实现多人服务端进行通信
from gevent import monkey
monkey.patch_all()
import gevent
import socket

def handle_request(sockobj):
    while True:
        recv_data = sockobj.recv(1024)
        print('服务端接受的消息:%s' %(recv_data.decode('utf-8')))
        if recv_data.decode('utf-8') == 'quit':
            return
        info = input('服务端发送的消息为:')
        sockobj.send(info.encode('utf-8'))


if __name__ == "__main__":
    server = socket.socket()
    server.bind(("172.25.254.250",9002))
    server.listen()
    while True:
        sockobj, addr = server.accept()
        gevent.spawn(handle_request,sockobj)
    sockobj.close()
    server.close()

注意:以上代码是通过程实现多个用户的通信,但仍然不能实现多人同时对服务端进行访问,服务端只能对每个客户端依次进行回答。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值