TCP编程
Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。
# -*- coding:UTF-8 -*-
# 导入socket库
import socket
# 创建一个socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 创建socket时,AF_INET指定使用IPv4协议
# 如果要用更先进的IPv6,就指定为AF_INET6。
# SOCK_STREAM指定使用面向流的TCP协议
# 建立连接 参数是一个tuple(服务器的ip地址(域名可以自动转换到ip地址)和端口号)
s.connect(('www.sina.com.cn',80))
# 常用端口:
# 80:web服务的标准端口
# 25:SMTP服务
# 21:FTP服务
# 端口号小于1024的是Internet标准服务的端口,端口号大于1024的,可以任意使用
# 建立连接之后,就可以发送请求(空格不能省!!)
s.send(b'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 = b''.join(buffer)
# 关闭连接
s.close()
# 接收到的数据包括HTTP头和网页本身
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)
TCP 服务端 - 客户端 通信
服务端
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 服务器
# 编写一个简单的服务器程序,它接收客户端连接,
# 把客户端发过来的字符串加上Hello再发回去。
import socket
import threading,time
# 每个连接都必须创建新线程(或进程)来处理
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(b'hello,%s'%data.decode('utf-8').encode('utf-8'))
sock.close()
print('Connection from %s:%s closed.'%addr)
if __name__ == '__main__':
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定监听的地址和端口
# 如果绑定到本机地址,则客户端必须同时在本机运行才能连接,
# 外部的计算机无法连接进来。
s.bind(('127.0.0.1',9999))
# 调用listen()方法开始监听端口,传入的参数指定等待连接的最大数量
s.listen(5)
print('Waiting for connection...')
# 接着,服务器通过一个永久循环来接收来自客户端的连接,
# accept()会等待并返回一个客户端的连接。
while True:
# 接收一个新连接
sock,addr = s.accept()
# 创建新线程来处理TCP连接
t = threading.Thread(target=tcplink,args=(sock,addr))
t.start()
客户端
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import threading,time
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1',9999))
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael',b'Tracy',b'Sarah']:
s.send(data)
print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()