python学习之socket编程

本文介绍了Socket编程的基础概念,包括客户端和服务端的操作流程,并详细解析了TCP三次握手建立连接的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#######socket编程######
1.socket编程
Socket 是网络编程的一个抽象概念。通常我们用一个 Socket 表示“打开了一个网络链接”,而打开一个 Socket 需要知道目标计算机的 IP
地址和端口号,再指定协议类型即可。
客户端操作
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 建立连接:
s.connect(('127.0.0.1', 9999))# 接收欢迎消息:
print s.recv(1024)
for data in ['Michael', 'Tracy', 'Sarah']:# 发送数据:
s.send(data)
print s.recv(1024)
s.send('exit')
s.close()服务端操作
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 监听端口:
s.bind(('127.0.0.1', 9999))
s.listen(5)
print 'Waiting for connection...'
while True:# 接受一个新连接:
sock, addr = s.accept()# 创建新线程来处理 TCP 连接:
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start()
s.close()
print 'Connection from %s:%s closed.' % addr服务端操作
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)over!
2.简单操作
服务端
import socket
s = socket.socket()
s.bind(('127.0.0.1',8888))
s.listen(9)
print 'waiting for connection....'
sock,addr = s.accept()
print 'accept a conection'
sock.send('welcome, hello client')
data = sock.recv(1024)
print data
s.close()
print 'connection close....'

客户端

import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1',8888))
print s.recv(1024)
s.send('hello server')

s.close()



3.socket中TCP的三次握手建立连接详解
我们知道tcp建立连接要进行“三次握手”,即交换三个分组。
大致流程如下:

    客户端向服务器发送一个SYN J
    服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1
    客户端再想服务器发一个确认ACK K+1

只有就完了三次握手,但是这个三次握手发生在socket的那几个函数中呢?请看下图:




socket中发送的TCP三次握手

从图中可以看出,当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。

Python作为一种高级编程语言,非常适合初学者学习Socket编程。以下是有关如何开始学习Python Socket编程的一些建议: ### 学习路径 #### 1. 掌握基础知识 - **理解网络基础概念**:包括IP地址、端口号、协议族(IPv4/IPv6)、传输层协议(TCP/UDP)等。 - **了解OSI七层模型及其实现原理**:重点在于运输层和服务质量保障方面的知识。 #### 2. Python内置模块`socket` Python自带了强大的`socket`库来进行低级网络通信。首先应该熟悉以下几个方面: - `import socket`: 导入socket模块; - 创建套接字实例:使用构造函数创建一个新的socket对象(`sock = socket.socket()`); - 绑定本地地址和监听端口:对于服务端来说,需要用`.bind()`方法绑定一个特定的地址与端口组合,并调用`.listen()`设置最大等待队列长度以便接受新的连接请求; - 连接到远程主机:客户端需要指定目标机器的信息并通过 `.connect()` 方法发起建立链接的动作; - 发送和接收消息:分别通过`.sendall(bytes)` 和 `.recv(buffer_size)` 来发送或读取数据流; - 关闭连接:完成所有交互后记得关闭已经打开过的sockets以释放占用资源。 #### 3. 实践项目练习 动手实践是巩固理论的最佳方式之一。可以从简单的小型实验做起,例如: - 编写一个小型的时间同步服务器,让其他设备向它查询当前时间戳; - 开发聊天室应用模拟多人在线交流场景,既锻炼并发处理能力又加深对网络IO的理解; - 尝试构建HTTP代理转发器来过滤网页内容或是作为反向代理实现负载均衡等功能; #### 4. 参考资料推荐 为了更好地理解和运用所学的知识点,这里列出几份优质的参考资料供参考: - [官方文档](https://docs.python.org/zh-cn/latest/library/socket.html) - 教程网站如菜鸟教程([http://www.runoob.com/python/python-socket.html])或廖雪峰老师的免费课程 - 相关书籍《Python核心编程》第二版附带有很多实用案例研究值得深入探讨 --- 下面给出一段非常简短的例子演示怎样快速启动一个简单的回声服务器: ```python # EchoServer.py import socket HOST, PORT = '', 8080 # 空字符串表示本机任意可用IP with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, PORT)) print(f"Starting server on {PORT}") while True: try: s.listen() conn, addr = s.accept() with conn: print('Connected by', addr) data = b'' while chunk := conn.recv(1024): if not chunk: break else: data += chunk response = f"You said: {data.decode().strip()}".encode() conn.sendall(response) except KeyboardInterrupt: print("Shutting down") exit() ``` 这段代码实现了最基本的TCP服务器模式,每当收到新信息时就原封不动返回给对方。你可以在此基础上进一步添加更多功能!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值