Python 套接字Socket
Socket是网络编程的一个抽象概念。Socket需要知道目标计算机的IP地址和端口号,再指定协议类型。
网络编程需要对客户端和服务器之间数据传输进行相关了解。
客户端:
大多数连接都是可靠的TCP连接。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # -*- coding: utf-8 -*- import socket # AF_INET指定使用IPv4协议,如果要用更先进的IPv6,就指定为AF_INET6。SOCK_STREAM指定使用面向流的TCP协议,这样,一个Socket对象就创建成功 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 客户端要主动发起TCP连接,必须知道服务器的IP地址和端口号 # SMTP服务是25端口,FTP服务是21端口,等等。端口号小于1024的是Internet标准服务的端口,端口号大于1024的,可以任意使用 s.connect(( 'www.sina.com.cn' , 80 )) # 发送数据: s.send( 'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n' ) # 接收数据: buffer = [] while True : # 每次最多接收1k字节: d = s.recv( 1024 ) if d: buffer .append(d) else : break data = ''.join( buffer ) header, html = data.split( '\r\n\r\n' , 1 ) print header # 把接收的数据写入文件: with open ( 'sina.html' , 'wb' ) as f: f.write(html) # 关闭连接: s.close() |
服务器:
服务器进程首先要绑定一个端口并监听来自其他客户端的连接。如果某个客户端连接过来了,服务器就与该客户端建立Socket连接,随后的通信就靠这个Socket连接了.
服务器会打开固定端口(比如80)监听,每来一个客户端连接,就创建该Socket连接。由于服务器会有大量来自客户端的连接,所以,服务器要能够区分一个Socket连接是和哪个客户端绑定的。
一个Socket依赖4项:服务器地址、服务器端口、客户端地址、客户端端口来唯一确定一个Socket。
但是服务器还需要同时响应多个客户端的请求,所以,每个连接都需要一个新的进程或者新的线程来处理,否则,服务器一次就只能服务一个客户端了。
服务器需要有自己的地址和端口,并且还需要获取客户端地址和端口,同时需要不断的监听客户端的链接。不能使用单线程。每一个客户端链接服务器,需要创建一个新的线程。
服务器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | # -*- coding: utf-8 -*- import socket import threading import time # 服务器进程首先要绑定一个端口并监听来自其他客户端的连接。如果某个客户端连接过来了, # 服务器就与该客户端建立Socket连接,随后的通信就靠这个Socket连接了 ''' 服务器会打开固定端口(比如80)监听,每来一个客户端连接,就创建该Socket连接。 由于服务器会有大量来自客户端的连接,所以,服务器要能够区分一个Socket连接是和哪个客户端绑定的。一个Socket 依赖4项:服务器地址、服务器端口、客户端地址、客户端端口来唯一确定一个Socket ''' # 创建一个基于IPv4和TCP协议的Socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 监听端口: s.bind(( '127.0.0.1' , 9999 )) # 调用listen()方法开始监听端口,传入的参数指定等待连接的最大数量: s.listen( 5 ) print 'Waiting for connection...' # 每个连接都必须创建新线程(或进程)来处理,否则,单线程在处理连接的过程中,无法接受其他客户端的连接 def tcplink(sock, addr): print 'Accept new connection from %s:%s...' % addr sock.send( 'Welcome!' ) while True : data = sock.recv( 1024 ) time.sleep( 1 ) if data = = 'exit' or not data: break sock.send( 'Hello, %s!' % data) sock.close() print 'Connection from %s:%s closed.' % addr # 服务器程序通过一个永久循环来接受来自客户端的连接,accept()会等待并返回一个客户端的连接: while True : # 接受一个新连接: sock, addr = s.accept() # 创建新线程来处理TCP连接: t = threading.Thread(target = tcplink, args = (sock, addr)) t.start() |
客户端:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # -*- coding: utf-8 -*- import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立连接: s.connect(( '127.0.0.1' , 9999 )) # 接收欢迎消息: print s.recv( 1024 ) for data in [ 'a' , 'b' , 'c' ]: # 发送数据: s.send(data) print s.recv( 1024 ) s.send( 'exit' ) s.close() |
小结:
用TCP协议进行Socket编程在Python中十分简单,对于客户端,要主动连接服务器的IP和指定端口,对于服务器,要首先监听指定端口,然后,对每一个新的连接,
创建一个线程或进程来处理。通常,服务器程序会无限运行下去。
同一个端口,被一个Socket绑定了以后,就不能被别的Socket绑定了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
· 【译】.NET 升级助手现在支持升级到集中式包管理
· 独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统
· 并发编程 - 线程同步(二)