Python网络编程
用TCP协议进行Socket编程在Python中十分简单,对于客户端,要主动连接服务器的IP和指定端口,对于服务器,要首先监听指定端口,然后,对每一个新的连接,创建一个线程或进程来处理。通常,服务器程序会无限运行下去。</br>
大多数连接都是可靠的TCP连接。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。
举个例子,当我们在浏览器中访问新浪时,我们自己的计算机就是客户端,浏览器会主动向新浪的服务器发起连接。如果一切顺利,新浪的服务器接受了我们的连接,一个TCP连接就建立起来的,后面的通信就是发送网页内容了。
客户端
import socket
#创建一个socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#建立连接
s.connect(('www.sina.com.cn',80))
#发送数据
s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')
#接收数据
buffer=[]
while True:
d=s.recv(1024)
if d:
buffer.append(d)
else:
break
data=b''.join(buffer)
#关闭连接
s.close()
header,html=data.split(b'\r\n\r\n',1)
print(header.decode('utf-8'))
#把接收的数据写入文件
with open('sina.html','wb') as f:
f.write(html)
服务器</br>
服务器进程首先要绑定一个端口并监听来自其他客户端的请求,如果某个客户端连接过来了,服务器就与该客户端建立Socket链接,随后的通信就靠这Socket连接了。由于服务器会有大量来自客户端的连接,所以,俯卧器要能够区分一个Socket连接适合那个客户端绑定的。一个Socket依赖4项来唯一确定一个Socket:服务器地址、服务器端口、客户端地址、客户端端口</br>
服务器还需要同时响应多个客户端的请求,所以每个连接都需要一个新的进程或者新的线程来处理。
import socket
def tcplink(sock,addr):
print('Accept new connection from %s:%s...' % addr)
sock.send(b'welcome!')
while True:
data=sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8')=='exit':
break
sock.send('Hello, %s!' % data.decode('utf-8')).encode('utf-8')
sock.close()
print('Connection from %s:%s closed.' % addr)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#监听端口:
s.bind(('127.0.0.1',9998))
s.listen(5)
print('Waiting for connection...')
while True:
#接受一个新连接
sock,addr=s.accept()
#创建新线程来处理TCP连接:
t=threading.Thread(target=tcplink,args=(sock,addr))
t.start()