参考原文

  廖雪峰Python教程

客户端

 我们知道每一条TCP的连接有2个端点,这两个端点叫做套接字socket。如果我们要进行基于TCP的通信必须先创建套接字。在Python中可以这样创建套接字socket,并向服务端发送请求:

#导入socket库
import socket
import io #创建一个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) #每次最多接收1K字节
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)

服务端

#导入socket库
import socket
import threading
import time
def tcplink(sock, addr):#新线程执行的函数
print('Accept new connection from %s:%s...' % addr)
sock.send(('Welcome!').encode('utf-8')) #发送数据给客户端
while True:
data = sock.recv(1024) #接收来自客户端的数据,最大(1k),阻塞式等待
time.sleep(1) # stop: 1s 避免过度占用CPU
#如果客户端没有发送数据或发送’exit‘:关闭连接
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) #创建一个基于IPv4和TCP协议的socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#绑定监听端口:(服务的端口号<1024时,需要管理员权限)
s.bind(('127.0.0.1', 9999)) #我们写的不是标准服务(标准服务HTTP,STMP)
#开始监听:
s.listen(5) #param : 等待连接的最大数量
print('waiting for connecting')
#永久循环来接收来自客户端的连接:
while True:
#接收一个新的连接:
sock, addr = s.accept() #accept会等待并发返回一个客户端的连接
#创建新线程(多线程)来处理这个连接:单线程在处理过程中,无法接收其他客户端的连接
t = threading.Thread(target=tcplink, args=(sock,addr))
t.start() #启动线程

  测试客户端代码:

import socket
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 [('Michael').encode('utf-8'), ('Tracy').encode('utf-8'), b'Search']:
s.send(data)
#打印从服务端返回的数据:
print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()

  运行效果:

Tips:用TCP协议进行Socket编程在Python中十分简单,对于客户端,要主动连接服务器的IP和指定端口,对于服务器,要首先监听指定端口,然后,对每一个新的连接,创建一个线程或进程来处理。通常,服务器程序会无限运行下去。 同一个端口,被一个Socket绑定了以后,就不能被别的Socket绑定了。

Python之TCP编程的更多相关文章

  1. python中的TCP编程学习

    今天看了一下关于python的TCP编程. 发现思路和其他语言(比如java)思路基本上差点儿相同. 先看client.基本过程例如以下: 第一步:创建一个socket 第二步:建立连接 第三步:发送 ...

  2. [Python] 网络编程之TCP编程

    转自:TCP编程 - 廖雪峰的官方网站 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协 ...

  3. python select网络编程详细介绍

    刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...

  4. Python 黑帽编程大纲(变化中)

    Python 黑帽编程大纲(预览版) 教程说明: 本系列教程,采用的大纲母本为<Understanding Network Hacks Attack and Defense with Pytho ...

  5. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  6. PYTHON黑帽编程1.5 使用WIRESHARK练习网络协议分析

    Python黑帽编程1.5  使用Wireshark练习网络协议分析 1.5.0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks At ...

  7. Python黑帽编程2.8 套接字编程

    Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...

  8. Python黑帽编程3.0 第三章 网络接口层攻击基础知识

    3.0 第三章 网络接口层攻击基础知识 首先还是要提醒各位同学,在学习本章之前,请认真的学习TCP/IP体系结构的相关知识,本系列教程在这方面只会浅尝辄止. 本节简单概述下OSI七层模型和TCP/IP ...

  9. Python黑帽编程 3.2 ARP监控

    Python黑帽编程 3.2 ARP监控 在第3.1节<ARP欺骗>中,我们学习了ARP的基本原理,使用Python实现了我们自己的ARP欺骗工具.在上一节的基础上,我们来实现一个ARP监 ...

随机推荐

  1. install Django in mac

    install Eclipse & Python(pydev) in mac install django in mac $ curl -O https://pypi.python.org/p ...

  2. 【bzoj4443】[Scoi2015]小凸玩矩阵

    第K大也就是第n-K+1小,所以就可以的二分答案了 (江哥讲过一道类似题) 二分答案找出比当前答案小的数的位置的坐标,判断一下是否可以选出满足不在同一行同一列的n-K+1个数,然后就可以跑匈牙利了,对 ...

  3. bzoj3550: [ONTAK2010]Vacation&&bzoj3112: [Zjoi2013]防守战线

    学了下单纯形法解线性规划 看起来好像并不是特别难,第二个code有注释.我还有...*=-....这个不是特别懂 第一个是正常的,第二个是解对偶问题的 #include<cstdio> # ...

  4. CSU 1807: 最长上升子序列~ 分类讨论

    1807: 最长上升子序列~ Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 138  Solved: 17[Submit][Status][Web Bo ...

  5. 使用NDK r10构建Cocosd-x v3.2时编译和链接错误的解决办法

    如果你使用NDK r10构建Cocos2d-x v3.2,将会遇到所有测试用例编译错误以及Lua测试用例链接错误. 1. 编译错误 错误信息是: 1 2 3 4 5 6 7 8 /Users/ming ...

  6. go语言---slice

    go语言---slice https://blog.csdn.net/cyk2396/article/details/78893420 一.数组切片的使用: //1.基于数组创建数组切片 var ar ...

  7. BZOJ_1862_[Zjoi2006]GameZ游戏排名系统&&BZOJ_1056_[HAOI2008]排名系统_Splay

    BZOJ_1862_[Zjoi2006]GameZ游戏排名系统&&BZOJ_1056_[HAOI2008]排名系统_Splay Description 排名系统通常要应付三种请求:上传 ...

  8. E20171228-hm

    traverse  n. 穿过; 横贯,横切; 横木; [建] 横梁;               vt. 通过; 横越,横贯; [法] 否认,反驳; [木工] 横刨;

  9. bzoj1880: [Sdoi2009]Elaxia的路线(spfa,拓扑排序最长路)

    1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1944  Solved: 759[Submit][St ...

  10. 字符类型C++(ascll码表)

    ascll码: 序号 字符 序号 字符 序号 字符 序号 字符 序号 字符 序号 字符 32 空格 48 0 64 @ 80 P 96 ` 112 p 33 ! 49 1 65 A 81 Q 97 a ...