python学习之socket编程

来源:互联网 发布:php windows 编译 编辑:程序博客网 时间:2024/06/01 08:41
#######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返回,至此三次握手完毕,连接建立。