Python中的socket

一     网络编程三要素

包括:IP地址、端口和协议

其中:

         1) IP地址:网络中每一台计算机的唯一标识,通过IP地址找到指定的计算机

   2) 端口:用于标识进程的逻辑地址,通过端口找到指定进程

   3) 协议:定义通信规则,符合协议则可以通信,不符合不能通信

二    socket

socket在所有语言中都是重要的网络编程知识点,而在Python中就有socket模块

socket模块中默认的参数:

family=AF_INET:用于服务器与服务器之间的网络通信
family=AF_INET6:基于IPV6方式的服务器与服务器之间的网络通信

type=SOCK_STREAM:基于TCP的流式socket通信
type=SOCK_DGRAM:基于UDP的数据报式socket通信

一般情况下都用的是IPV4

1)  通过TCP协议进行:

TCP服务端:

import socket
#1.创建socket对象
server=socket.socket()
#2.绑定ip和port
server.bind(('172.25.254.69',9009))
#3.监听客户端连接
server.listen()
print('服务端端口已经启动...')
#4.接收客户端连接
sockobj,address=server.accept()
while True:
    #5.接收客户端发送的消息
    recv_data=sockobj.recv(1024).decode('utf-8')
    print('client:%s'%(recv_data))
    if recv_data=='quit':
        break
    #6.给客户端回复消息
    send_data=input('server: ')
    if send_data=='quit':
        break
    sockobj.send(send_data.encode('utf-8'))

#7.关闭socket对象
server.close()
sockobj.close()

执行结果:

TCP客户端:

import socket
#1.创建socket对象
server=socket.socket()
#2.绑定ip和port
server.bind(('172.25.254.69',9009))
#3.监听客户端连接
server.listen()
print('服务端端口已经启动...')
#4.接收客户端连接
sockobj,address=server.accept()
while True:
    #5.接收客户端发送的消息
    recv_data=sockobj.recv(1024).decode('utf-8')
    print('client:%s'%(recv_data))
    if recv_data=='quit':
        break
    #6.给客户端回复消息
    send_data=input('server: ')
    if send_data=='quit':
        break
    sockobj.send(send_data.encode('utf-8'))

#7.关闭socket对象
server.close()
sockobj.close()

执行的结果:

客户端连接服务端,以此来实现通讯

程序只能连接一个客户端,并不能支持多并发,所以当出现第二个客户端时,就会出现挂起不动,所以想要完成多并发,可以通过前面提到的多协程来实现,当然还有其它的方法

TCP通过多协程来实现接收多个客户端:

import socket
from gevent import monkey
monkey.patch_all()
import gevent

def handle_requst(sockobj):
    while True:
        #5.接收客户端发送的消息
        recv_data=sockobj.recv(1024).decode('utf-8')
        print('client:%s'%(recv_data))
        if recv_data=='quit':
            break
        #6.给客户端回复消息
        send_data=input('server: ')
        if send_data=='quit':
            break
        sockobj.send(send_data.encode('utf-8'))

#1.创建socket对象
server=socket.socket()
#2.绑定ip和port
server.bind(('172.25.254.69',9009))
#3.监听客户端连接
server.listen()
print('服务端端口已经启动...')
while True:
    #4.接收客户端连接
    sockobj,address=server.accept()
    gevent.spawn(handle_requst,sockobj)
#7.关闭socket对象
server.close()
sockobj.close()

每一次接收客户端连接后,便开启一个协程,以此来实现同时接收多个客户端

2)    通过UDP协议进行

UDP服务端:

import socket
host='172.25.254.69'
port=9090
#1.创建socket对象
server=socket.socket(type=socket.SOCK_DGRAM)
#2.绑定ip和port
server.bind((host,port))
print('等待客户端的UDP连接...')
#3.接收客户端发送的消息
data,address=server.recvfrom(1024)
print('接收到的客户端消息为: ',data.decode('utf-8'))
print('客户端连接的socket地址: ',address)
#4.给客户端回复消息
server.sendto(b'hello client',address)
#5.关闭socket对象
server.close()

执行的结果:

UDP客户端:

import socket
host='172.25.254.69'
port=9090
#1.创建socket对象
client=socket.socket(type=socket.SOCK_DGRAM)
#2.发送消息给服务端
client.sendto(b'hello server',(host,port))
#3.接收服务端返回的消息
data,address=client.recvfrom(1024)
print('接收到的服务端消息: ',data.decode('utf-8'))
#4.关闭socket对象
client.close()

执行的结果:

执行结束,接收到服务端的连接成功通知

此时,服务端得到客户端的消息,以及IP地址和客户端连接的socket地址

三   通过socket获取网页内容

通过IP地址和端口号来对网页发送请求,获取简单的信息

import socket
client=socket.socket()
client.connect(('www.baidu.com',80))
client.send(b'GET / HTTP/1.1\r\nHost:www.baidu.com\r\nConnection: close\r\n\r\n')
recv_data=client.recv(1024*100)
print(recv_data.decode('utf-8'))
client.close()

执行的结果:

/home/kiosk/anaconda2/envs/2048/bin/python /home/kiosk/PycharmProjects/python/协程/11_获取网页内容.py
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 14615
Content-Type: text/html
Date: Mon, 08 Oct 2018 08:43:10 GMT
Etag: "5ba38008-3917"
Last-Modified: Thu, 20 Sep 2018 11:10:00 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
Server: BWS/1.1
Set-Cookie: BAIDUID=AE734014F5C6A5C24B8409768A128AFF:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=AE734014F5C6A5C24B8409768A128AFF; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1538988190; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1
Connection: close

<!DOCTYPE html><!--STATUS OK-->
<html>
<head>
	<meta http-equiv="content-type" content="text/html;charset=utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=Edge">
	<link rel="dns-prefetch" href="//s1.bdstatic.com"/>
	<link rel="dns-prefetch" href="//t1.baidu.com"/>
	<link rel="dns-prefetch" href="//t2.baidu.com"/>
	<link rel="dns-prefetch" href="//t3.baidu.com"/>
	<link rel="dns-prefetch" href="//t10.baidu.com"/>
	<link rel="dns-prefetch" href="//t11.baidu.com"/>
	<link rel="dns-prefetch" href="//t12.baidu.com"/>
	<link rel="dns-prefetch" href="//b1.bdstatic.com"/>
	<title>百度一下,你就知道</title>
	<link href="http://s1.bdstatic.com/

Process finished with exit code 0

得到的结果是一个html页面,可通过html对其解析

Python,`socket`是一个用于网络编程的模块。它提供了一组用于创建和操作套接字的函数和类。套接字允许计算机之间通过网络进行通信。引用提到了Python提供的两个基本的socket模块:SocketSocketServer。 引用是一个服务器端的代码示例,它使用了`socket`模块的函数和方法来创建一个服务器套接字,并监听来自客户端的连接请求。一旦有客户端连接,服务器将接收来自客户端的数据,并向客户端发送回应。 引用则是一个客户端的代码示例,它同样使用了`socket`模块的函数和方法。客户端代码连接到指定的服务器套接字,并通过套接字向服务器发送数据。收到服务器的回应后,客户端打印出接收到的数据。 总结起来,Python的`socket`模块提供了一种简单而强大的方式来进行网络通信。通过创建套接字,我们可以在服务器和客户端之间传输数据,并实现各种网络应用,如聊天室、文件传输等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [PythonSocket编程](https://blog.csdn.net/weixin_45794666/article/details/112367758)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [《Python进阶系列》二十:网络编程必备的socket模块](https://blog.csdn.net/qq_37085158/article/details/122535289)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值