您的位置:首页 > 理论基础 > 计算机网络

python 网络编程之 TCP编程

2016-03-23 20:39 302 查看

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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息