python网络编程-socket
python提供了两个socket模块
Socket,它提供了标准的BSD Sockets API
SocketServer,它提供了服务器中心类,可以简化网络服务器的开发
下面先说socket模块
1、socket类型
套接字格式:
socket(family,type[,protocal]) 使用给定的地址、套接字类型、协议编号(默认为0)来创建套接字
常用的套接字类型:
socket.SOCK_STREAM 面向连接的,TCP
socket.SOCK_DGRAM无连接,UDP
创建TCP Socket:s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
创建UDP Socket:s=socket.socket(socket.AF_INET,socket.DGRAM)
2、socket函数
注意点:
1)TCP返送数据时,已建立好TCP连接,所以不需要指定地址。UDP是面向无连接的,每次发送要指定是发给谁。
2)python2.x版本发送的是字符串格式的数据,python3.x是字节格式,需注意。
s.bind(address) 将套接字绑定到地址,在AF_INET下,以元组(host,port)的形式表示地址
s.listen(backlog) 开始监听TCP传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值最少为1,大部分应用程序设定为5就可以了。
s.accept() 接收TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
s.connect(address) 连接到address处的套接字。一般address的格式为元组(hostname,port),如果连接出错,返回socket error错误。
s.connect_ex(address) 功能与connect(address)相同,但是成功返回0,失败返回error的值。
s.recv(bufsize[,flag]) 接收TCP套接字的数据。数据以bytes字节形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
s.send(string[,flag]) 发送TCP数据。将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
s.sendall(string[,flag]) 完整发送TCP数据。将string中的数据发送到连接的套接字。但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
s.close() 关 闭套接字。
3、socket编程思路
TCP服务端:
1 创建套接字,绑定套接字到本地IP与端口
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind()
2 开始监听连接
s.listen()
3 进入循环,不断接受客户端的连接请求
s.accept()
4 然后接收传来的数据,并发送给对方数据
s.recv()
s.sendall()
5 传输完毕后,关闭套接字
s.close()
TCP客户端:
1 创建套接字,连接远端地址
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect()
2 连接后发送数据和接收数据
s.sendall()
s.recv()
3 传输完毕后,关闭套接字
s.close()
4、简单的socket编程代码
SERVER端:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#!/usr/bin/env python# -*- coding: utf-8 -*- import socket #导入socket模块 ip_port=('127.0.0.1',9999) #定义主机,端口号 s=socket.socket() #实例化socket对象(买手机) s.bind(ip_port) #绑定IP端口(买手机卡) s.listen(5) #建立5个连接池,等待接收请求,挂起连接 #等待电话conn,addr=s.accept() #conn就是建立通信,负责收发消息的通道,每次只处理一个请求, #accept是阻塞请求,当第二个请求来的时候会进入listen连接池 #挂起等待处理while True: try: recv_data = conn.recv(1024) #收消息 if len(recv_data) == 0:break #如果客户输入为空的话退出 if recv_data == 'exit':break #客户端退出,服务端跟着退出 send_data = recv_data.upper() print(send_data) conn.send(send_data) #回复消息 except Exception: break conn.close() #挂电话,关闭连接通道 |
Client端:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#!/usr/bin/env python# -*- coding: utf-8 -*- import socket ip_port=('127.0.0.1',9999) s=socket.socket() s.connect(ip_port) #这里的connect实际是服务端的conn,与服务端建立连接 while True: send_data=input(">>>: ").strip() #发送消息 if send_data == 'exit':break if len(send_data) == 0:continue s.send(bytes(send_data,encoding='utf-8')) #收消息 recv_data=s.recv(1024) print(str(recv_data,encoding='utf-8')) #挂电话s.close() |
python网络编程-socket的更多相关文章
- Day07 - Python 网络编程 Socket
1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...
- Python网络编程socket
网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- python网络编程socket /socketserver
提起网络编程,不同于web编程,它主要是C/S架构,也就是服务器.客户端结构的.对于初学者而言,最需要理解的不是网络的概念,而是python对于网络编程都提供了些什么模块和功能.不同于计算机发展的初级 ...
- python --- 网络编程Socket
网络编程 定义:所为网络编程即是对信息的发送和接收. 主要工作: (1)发送端:将信息以规定的协议组装成数据包. (2)接收端:对收到的数据包解析,以提取所需要的信息. Socket:两个在网络上的程 ...
- Python网络编程-Socket简单通信(及python实现远程文件发送)
学习python中使用python进行网络编程,编写简单的客户端和服务器端进行通信,大部分内容来源于网络教程,这里进行总结供以后查阅. 先介绍下TCP的三次握手: 1,简单的发送消息: 服务器端: i ...
- Day10 Python网络编程 Socket编程
一.客户端/服务器架构 1.C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务)[QQ,SSH,MySQL,FTP] 2.C/S架构与socket的关系: 我们学习soc ...
- python网络编程——socket基础篇
python的网络编程比c语言简单许多, 封装许多底层的实现细节, 方便程序员使用的同时, 也使程序员比较难了解一些底层的东西. 1 TCP/IP 要想理解socket,首先得熟悉一下TCP/IP协议 ...
- Python 网络编程——socket
一 客户端/服务器架构 客户端(Client)服务器(Server)架构,即C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务) 理想/目标状态—— 最常用的软件服务器是 ...
- Python网络编程—socket(二)
http://www.cnblogs.com/phennry/p/5645369.html 接着上篇博客我们继续介绍socket网络编程,今天主要介绍的内容:IO多路复用.多线程.补充知识点. 一.I ...
随机推荐
- 解决Entity Framework中DateTime类型字段异常
从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值 具体的错误原因是:C#中的DateTime类型比SqlServer中的datetime范围大.SqlServe ...
- VS2015编译Qt5.7.0生成支持XP的静态库(很不错)
一.编译工具 1.VS2015 编译Qt5.7.0的所需VS版本:Visual Studio 2013 (Update1)或Visual Studio 2015 (Update2).因为Update补 ...
- 如何在Eclipse中查看JDK以及JAVA框架的源码(转载)
原文链接:http://www.cnblogs.com/outlooking/p/5243415.html 设置步骤如下: 1.点 “window”-> "Preferences&qu ...
- Linux下查看Nginx安装目录、版本号信息?
Linux环境下,怎么确定Nginx是以那个config文件启动的? 输入命令行: ps -ef | grep nginx 摁回车,将出现如下图片: master process 后面的就是 ngi ...
- lucence.net+盘古分词
第一步: 添加盘古和lucence的dll引用 第二步: 拷贝Dict文件夹到项目 demo里面是Dictionaries 不过官方建议改成Dict 然后把所有项右击属性 改为“如果较新则复制” 第 ...
- ASP.Net中的Web Resource
http://support.microsoft.com/kb/910442,这是中文的,机器翻译的,不太容易看懂,英文的是:http://support.microsoft.com/kb/91044 ...
- HBA相关知识
HBA使用详解: 一般的AIX客户端支持的HBA为Emulex HBA卡和交换机硬件确保连接成功的标志: A. 如果是 Emulex卡,卡上的绿灯常亮,黄灯闪烁. B. 如果是 QLogic卡,卡上的 ...
- PHP小总结
<?php //1.php基础语法 //输出语句 echo print print_r var_dump() //2.php是弱类型语言 //强制转换类型:(类型)变量 settype(变量,类 ...
- 判断访问的是移动端还是PC端,如果是移动端跳转页面
<script type="text/javascript"> var mobileAgent = new Array("iphone", &quo ...
- (转)学习使用Jmeter做压力测试(一)--压力测试基本概念
一.性能测试的概念 性能测试是通过自动化的测试工具模拟多种正常峰值及异常负载条件来对系统的各项性能指标进行测试.负载测试和压力测试都属于性能测试,两者可以结合进行. 通过负载测试,确定在各种工作负载下 ...