python socket 编程简单入门
想讲讲套接字的概念
套接字,即英文socket的中文意译,起源于20世纪70年代,是加利福利亚大学的伯克利版本UNIX(称为BSD UNIX)的一部分。目的是实现主机上运行的一个程序与另一个运行的程序进行通信。
套接字像一个电话插孔--允许通信的一些基础设施,那么主机号和端口号就像区号和电话号码的组合。
套接字类型
1 UNIX套接字
即AF_UNIX, 它代表地址家族:UNIX。Python在内的大多数受欢迎的平台都使用缩写AF指代。
2 网络套接字
即AF_INET,它代表地址家族:因特网。而AF_INET6用于IPV6
3 其他套接字
AF_NETLINK家族,AF_TIPC ,这两种是特殊的LINUX套接字类型
python支持以上四种套接字
实际使用中,我们用的最多的时AF_INET,其有可以分为:
1 面向连接的套接字
即实现TCP协议的套接字,具体名称为SOCK_STREAM
2 无连接的套接字
即实现UDP协议的套接字,名称为SOCK_DGRAM(datagram数据报)
接下就是Python 如何进行socket编程的介绍。
python通过socket库,我们可以很方便使用socket编程。
创建套接字:socket.socket(socket.family, socket_type, protocol=0)
socket_family是AF_UNIX或AF_INET, socket_type是SOCK_STREAM或SOCK_DGRAM。protocol默认为0
先来一个tcp例子:
SimpleSocketServer.py
实现了一个最多同时处理5个socket client 的简单socket server
#coding:'utf-8'
import socket
import threading
import sys BUFSIZE = 1024 class SimpleSocketServer(): def __init__(self, ip, port):
self.ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.addr = (ip, port)
self.stop = False def start(self):
self.ss.bind(self.addr)
self.ss.listen(5)
try:
while True:
if self.stop:
break
cs, addr = self.ss.accept()
th_cs = threading.Thread(target=self.cs_handler, args=(cs, addr))
th_cs.start()
except KeyboardInterrupt:
self.ss.close()
sys.exit() def stop_server(self):
self.stop = True def cs_handler(self, cs, addr):
print 'client[%s] has client to server...' % str(addr)
try:
while True:
data = cs.recv(BUFSIZE)
if not data:
break
cs.send('hello, you send data is [%s]' % data)
except KeyboardInterrupt:
sys.exit() if __name__ == '__main__':
SimpleSocketServer('127.0.0.1', 33233).start()
SimpleSocketClient.py
#coding:'utf-8'
import socket
import thread
import sys if __name__ == '__main__':
cs = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
cs.connect(('127.0.0.1',33233)) while True:
try:
INPUT = raw_input('you input >')
cs.send(INPUT)
data = cs.recv(1024)
print 'from server: %s' % data
except KeyboardInterrupt:
cs.close()
sys.exit(0)
break
except EOFError:
print 'Unknown End of file!'
continue
特别说明:
当超过一个以上的client连到socket server时,在终端会看到
λ python SimpleSocketServer.py
client[('127.0.0.1', 49308)] has client to server...
client[('127.0.0.1', 49568)] has client to server...
这是为什么呢?
一旦TCP服务器接受了一个连接,就会返回(accept()实现)一个独立的客户端套接字,用来与即将到来的消息进行交互。这时原始服务器套接字就能继续接受新的客户端连接请求了。
下面是一个UDP的例子:
udp服务器:
#coding:'utf-8'
import socket
import threading
import sys BUFSIZE = 1024 class SimpleUDPServer(): def __init__(self, ip, port):
self.ss = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.addr = (ip, port)
self.stop = False def start(self):
self.ss.bind(self.addr) try:
while True:
if self.stop:
break
data, addr = self.ss.recvfrom(BUFSIZE)
print 'udp server recvfrom client[%s]:%s ' % (str(addr), data)
self.ss.sendto('hello, you send data is [%s]' % data, addr)
except KeyboardInterrupt:
self.ss.close()
sys.exit() def stop_server(self):
self.stop = True if __name__ == '__main__':
SimpleUDPServer('127.0.0.1', 33233).start()
udp客户端:
#coding:'utf-8'
import socket
import thread
import sys if __name__ == '__main__':
cs = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
addr = ('127.0.0.1',33233) while True:
try:
INPUT = raw_input('you input >')
cs.sendto(INPUT, addr)
data, addr = cs.recvfrom(1024)
print 'from server[%s]: %s' % (str(addr),data)
except KeyboardInterrupt:
cs.close()
sys.exit(0)
break
except EOFError:
print 'Unknown End of file!'
continue
当udp有接受到client连接到的数据时:
λ python SimpleUDPServer.py
udp server recvfrom client[('127.0.0.1', 57959)]:;;
udp server recvfrom client[('127.0.0.1', 57959)]:ffdfdf
udp server recvfrom client[('127.0.0.1', 63667)]: 111
udp server recvfrom client[('127.0.0.1', 63667)]:fdfdf
UDP和TCP服务器之间的另一个显著 差异是,因为数据报套接字是无连接的,所以就没有为了成功通信而使一个客户端连接到一个独立的套接字“转换”的操作
python socket 编程简单入门的更多相关文章
- python socket编程入门(编写server实例)+send 与sendall的区别与使用方法
python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参 ...
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- Python黑客编程2 入门demo--zip暴力破解
Python黑客编程2 入门demo--zip暴力破解 上一篇文章,我们在Kali Linux中搭建了基本的Python开发环境,本篇文章为了拉近Python和大家的距离,我们写一个暴力破解zip包密 ...
- python socket编程笔记
用python实现一个简单的socket网络聊天通讯 (Linux --py2.7平台与windows--py3.6平台) 人生苦短之我用Python篇(socket编程) python之路 sock ...
- Python Socket 编程示例 Echo Server
简评:我们已经从「Python Socket 编程概览」了解了 socket API 的概述以及客户端和服务器的通信方式,接下来让我们创建第一个客户端和服务器,我们将从一个简单的实现开始,服务器将简单 ...
- Python Socket 编程——聊天室演示样例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket ...
- python/socket编程之粘包
python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 发送端可以是1k,1k的发送数据而接受端的应用程序可以2k,2k的提 ...
- PYTHON SOCKET编程简介
原文地址: PYTHON SOCKET编程详细介绍 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 Soc ...
- [Python_7] Python Socket 编程
0. 说明 Python Socket 编程 1. TCP 协议 [TCP Server] 通过 netstat -ano 查看端口是否开启 # -*-coding:utf-8-*- "&q ...
随机推荐
- 2018.10.31 vijos1052贾老二算算术(高斯消元)
传送门 高斯消元模板题. 写的时候反了sbsbsb错误消元的时候除数和被除数反了. 所以把板子贴上来压压惊. 代码: #include<bits/stdc++.h> using names ...
- 百度api接口_知识积累
app_id, app_key, app_secret app_id 是用来标记你的开发者账号的, 是你的用户id, 这个id 在数据库添加检索, 方便快速查找 app_key 和 app_secre ...
- centos7 新增ip
1.进入network-scripts目录:cd /etc/sysconfig/network-scripts/ 2.复制ifcfg-eth0: cp ifcfg-eth0 ifcfg-eth0:0 ...
- form表单序列化为json格式数据
在web开发过程中,经常遇到将form序列化不能格式的字符串提交到后台,下面就介绍怎样将form表单序列化为json字符串. 首先,是扩展的jquery序列化插件,依赖jquery.经测试,这段代码可 ...
- Ng第八课:神经网络表述(Neural Networks: Representation)
8.1 非线性假设 8.2 神经元和大脑 8.3 模型表示 1 8.4 模型表示 2 8.5 特征和直观理解 1 8.6 样本和直观理解 II 8.7 多类分类 8.1 非线性假设 无 ...
- 为什么要用GCD-Swift2.x
为什么要用GCD-Swift2.x 当今世界,多核已然普及.但是APP却不见得很好的跟上了这个趋势.APP 想要利用好多核就必须可以保证任务能有效的分配.并行执行可以让APP同时执行很多 的任务.这个 ...
- stm32的gpio函数介绍
一.gpio_init函数 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) 调用时的格式一般是例如 RCC ...
- SSM_CRUD新手练习(5)测试mapper
上一篇我们使用逆向工程生成了所需要的bean.dao和对应的mapper.xml文件,并且修改好了我们需要的数据库查询方法. 现在我们来测试一下DAO层,在test包下新建一个MapperTest.j ...
- 防Xss注入
转自博客:https://blog.csdn.net/qq_21956483/article/details/54377947 1.什么是XSS攻击 XSS又称为CSS(Cross SiteScrip ...
- ORACLE中的FTP例子代码
http://blog.csdn.net/mashengwang/article/details/5982663 CREATE OR REPLACE DIRECTORY my_docs AS '/u0 ...