python实现TCP/UDP通信
一.说明
对于TCP/udp的说明已经很多了,我在这里只是简单的说明一下
二.套接字scoket
套接字是一种具有之前所说的“通信端点”概念的计算网络数据结构。相当
于电话插口,没它无法通信,这个比喻非常形象。
套接字起源于20世纪70年代加州伯克利分校版本的Unix,即BSD Unix
。又称为“伯克利套接字”或“BSD套接字”。最初套接字被设计用在同一台
主机上多个应用程序之间的通讯,这被称为进程间通讯或IPC。
套接字分两种:基于文件型和基于网络的
第一个套接字家族为AF_UNIX,表示“地址家族:UNIX”。包括
Python在内的大多数流行平台上都使用术语“地址家族”及其缩写AF。由于两
个进程都运行在同一台机器上,而且这些套接字是基于文件的,所以它们的底
层结构是由文件系统来支持的。可以理解为同一台电脑上,文件系统确实是不
同的进程都能进行访问的。
第二个套接字家族为AF_INET,表示”地址家族:Internet“。还有
一种地址家族AF_INET6被用于网际协议IPv6寻址。Python 2.5中加入了一种
Linux套接字的支持:AF_NETLINK(无连接)套接字家族,让用户代码与内核
代码之间的IPC可以使用标准BSD套接字接口,这种方法更为精巧和安全。
Python只支持AF_UNIX、AF_NETLINK和AF_INET家族。网络编程关注
AF_INET。
如果把套接字比作电话的查看——即通信的最底层结构,那主机与端
口就相当于区号和电话号码的一对组合。一个因特网地址由网络通信必须的主
机与端口组成。
而且另一端一定要有人接听才行,否则会提示”对不起,您拨打的电
话是空号,请查询后再拨“。同样你也可能会遇到如”不能连接该服务器、服
务器无法响应“等。合法的端口范围是0~65535,其中小于1024端口号为系统
保留端口。
三.面向连接与无连接
面向连接:通信之前一定要建立一条连接,这种通信方式也被成为”虚电路
“或”流套接字“。面向连接的通信方式提供了顺序的、可靠地、不会重复的
数据传输,而且也不会被加上数据边界。这意味着,每发送一份信息,可能会
被拆分成多份,每份都会不多不少地正确到达目的地,然后重新按顺序拼装起
来,传给正等待的应用程序。
实现这种连接的主要协议就是传输控制协议TCP。要创建TCP套接字就
得创建时指定套接字类型为SOCK_STREAM。TCP套接字这个类型表示它作为流套
接字的特点。由于这些套接字使用网际协议IP来查找网络中的主机,所以这样
形成的整个系统,一般会由这两个协议(TCP和IP)组合描述,即TCP/IP。
无连接:无需建立连接就可以通讯。但此时,数据到达的顺序、可靠
性及不重复性就无法保障了。数据报会保留数据边界,这就表示数据是整个发
送的,不会像面向连接的协议先拆分成小块。它就相当于邮政服务一样,邮件
和包裹不一定按照发送顺序达到,有的甚至可能根本到达不到。而且网络中的
报文可能会重复发送。
那么这么多缺点,为什么还要使用它呢?由于面向连接套接字要提供
一些保证,需要维护虚电路连接,这都是严重的额外负担。数据报没有这些负
担,所有它会更”便宜“,通常能提供更好的性能,更适合某些场合,如现场
直播要求的实时数据讲究快等。
实现这种连接的主要协议是用户数据报协议UDP。要创建UDP套接字就
得创建时指定套接字类型为SOCK_DGRAM。这个名字源于datagram(数据报),
这些套接字使用网际协议来查找网络主机,整个系统叫UDP/IP。
四.socket()模块函数
使用socket模块的socket()函数来创建套接字。语法如下:
socket(socket_family, socket_type, protocol=0)
其中socket_family不是AF_VNIX就是AF_INET,socket_type可以是
SOCK_STREAM或者SOCK_DGRAM,protocol一般不填,默认值是0。
创建一个TCP/IP套接字的语法如下:
tcpSock = socket.socket(socket.AF_INET,
socket.SOCK_STREAM)
同样创建一个UDP/IP套接字的语法如下:
udpSock = socket.socket(socket.AF_INET,
socket.SOCK_DGRAM)
由于socket模块中有太多属性,所以使用"from socket import *"语
句,把socket模块里面的所有属性都带到命名空间中,大幅缩短代码。调用如
下:
tcpSock = socket(AF_INET, SOCK_STREAM)
五.套接字对象
下面是最常用的套接字对象方法:
服务器端套接字函数
socket类型 |
描述 |
s.bind() |
绑定地址(主机号 端口号对)到套接字 |
s.listen() |
开始TCP监听 |
s.accept() |
被动接受TCP客户端连接,(阻塞式)等待连续的到来 |
客户端套接字函数
socket类型 |
描述 |
s.connect() |
主动初始化TCP服务器连接 |
s.connect_ex() |
connect()函数扩展版本,出错时返回出错码而不是跑出异常 |
公共用途的套接字函数
socket类型 |
描述 |
s.recv() |
接受TCP数据 |
s.send() |
发送TCP数据 |
s.sendall() |
完整发送TCP数据 |
s.recvfrom() |
接受UDP数据 |
s.sendto() |
发送UDP数据 |
s.getpeername() |
连接到当前套接字的远端地址(TCP连接) |
s.getsockname() |
获取当前套接字的地址 |
s.getsockopt() |
返回指定套接字的参数 |
s.setsockopt() |
设置指定套接字的参数 |
s.close() |
关闭套接字 |
面向模块的套接字函数
socket类型 |
描述 |
s.setblocking() |
设置套接字的阻塞与非阻塞模式 |
s.settimeout() |
设置阻塞套接字操作的超时时间 |
s.gettimeout() |
得到阻塞套接字操作的超时时间 |
面向文件的套接字函数
socket类型 |
描述 |
s.fileno() |
套接字的文件描述符 |
s.makefile() |
创建一个与套接字关联的文件对象 |
六.代码实现
TCP服务端代码
#! /usr/bin/env python #coding=utf-8 import socket bind_ip = "" bind_port = 9999 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind((bind_ip,bind_port)) server.listen(5) try: while True: client,add = server.accept() print "[*]你监听的是:%s:%d" % (add[0],add[1]) while True: data = client.recv(1024) if not data: break print data data = raw_input('> ') client.send(data) # print data else: client.close() except Exception as e: print e server.close()
TCP客户端代码
#! /usr/bin/env python #coding=utf-8 import socket target_host = "127.0.0.1" target_port = 9999 #建立一个socket对象 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #链接客户端 client.connect((target_host,target_port)) while True: data = raw_input('> ') client.send(data) #发送一些数据 #client.send("GET /HTTP/1.1\r\nHost:baidu.com\r\n\r\n") data = client.recv(4096) if not data: break print data
UDP服务端
# -*- coding: utf-8 -*- from socket import * from time import ctime HOST = '' #主机名 PORT = 21567 #端口号 BUFSIZE = 1024 #缓冲区大小1K ADDR = (HOST,PORT) udpSerSock = socket(AF_INET, SOCK_DGRAM) udpSerSock.bind(ADDR) #绑定地址到套接字 while True: #无限循环等待连接到来 try: print 'Waiting for message ....' data, addr = udpSerSock.recvfrom(BUFSIZE) #接受UDP print 'Get client msg is: ', data udpSerSock.sendto('[%s] %s' %(ctime(),data), addr) #发送UDP print 'Received from and returned to: ',addr except Exception,e: print 'Error: ',e udpSerSock.close() #关闭服务器
UDP服务端
# -*- coding: utf-8 -*- from socket import * HOST = 'localhost' #主机名 PORT = 21567 #端口号 与服务器一致 BUFSIZE = 1024 #缓冲区大小1K ADDR = (HOST,PORT) udpCliSock = socket(AF_INET, SOCK_DGRAM) while True: #无限循环等待连接到来 try: data = raw_input('>') if not data: break udpCliSock.sendto(data, ADDR) #发送数据 data,ADDR = udpCliSock.recvfrom(BUFSIZE) #接受数据 if not data: break print 'Server : ', data except Exception,e: print 'Error: ',e udpCliSock.close() #关闭客户端
python实现TCP/UDP通信的更多相关文章
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.3
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.2
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.1
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.4.1
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.3.1
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.2.3
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.2.2 正式发布
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- HP-SOCKET TCP/UDP通信框架库解析
项目概述: HP-SOCKET是一套通用TCP/UDP通信框架,包括服务器.客户端.Agent组件:其目标是提供高性能.通用性.简易性.可扩展.可定制: 鉴于此,其仅实现基本的通用框架通信.数据收发功 ...
- Python的网络编程[0] -> socket[2] -> 利用 socket 建立 TCP/UDP 通信
Socket 目录 socket 的 TCP/IP 通信基本建立过程 socket 的 UDP 通信基本建立过程 socket 的 UDP 广播式通信基本建立过程 socket 的多线程通信建立过程 ...
随机推荐
- win10环境下python3.5安装步骤
点我去Python官网下载 往下翻几页就能看到各种版本的Python,当前最新的是Python3.6,也没多大区别,我选择的是3.5.2 64位的,点击download 根据自己的电脑配置,我选择的是 ...
- 吉特仓储管系统(开源)--使用Grunt压缩JS文件
在吉特仓储管理系统开发的过程中大量使用到了JS,随着JS文件的增多我们需要对JS进行有效的管理,同时也要对JS文件进行一些压缩.文本用于记录一下使用grunt压缩JS的操作步骤,便于遗忘之后记录查找, ...
- C++编程练习(4)----“实现简单的栈的链式存储结构“
如果栈的使用过程中元素数目变化不可预测,有时很小,有时很大,则最好使用链栈:反之,如果它的变化在可控范围内,使用顺序栈会好一些. 简单的栈的链式存储结构代码如下: /*LinkStack.h*/ #i ...
- (@WhiteTaken)设计模式学习——单例模式
单例模式,个人理解就是,使用了这个模式,可以保证一个类只生成唯一的实例对象.就是在整个程序中,这个类只存在一个实例对象. GoF对单例模式的定义:保证一个类,只有一个实例存在,同时提供能对该实例加以访 ...
- Raid类型
raid0:两块磁盘同时写入raid1:一块磁盘写入,另一块磁盘做备份,利用率50%raid5:两块磁盘同时写入两块磁盘都有内容,第三块磁盘做效应,n/n-1的利用率raid6:四块磁盘两块磁盘做存储 ...
- 关于AngularJS学习整理---浅谈$scope(作用域) 新手必备!
作为初次接触 AngularJS的新手,想要深层理解里面的内容短时间还是不可能的,所以标题写了浅谈字样,以下内容是参考各位大神以及相关书籍整理加个人理解,出现错误的地方请大家指正. $scope(作用 ...
- 转:JSP 分页显示数据 (Oracle)
JSP 分页显示数据 (Oracle) 标签: Oracle分页JSP分页 2013-11-19 20:40 3598人阅读 评论(1) 收藏 举报 分类: Web(11) 版权声明:本文为博主原 ...
- DLL 导出类
MyMathFun.h #pragma once // #ifdef DLLCLASS_API // #define DLLCLASS_API _declspec(dllimport) // #els ...
- php微信网页授权获取用户信息
配置回调域名: 1. 引导用户进入授权页面同意授权,获取code 2. 通过code换取网页授权access_token(与基础支持中的access_token不同) 3. 如果需要,开发者可以刷新网 ...
- node-webkit制作桌面应用
心血来潮突然想用js尝试写桌面应用,突然发现我大js真的无所不能.在网上搜到了这么一个东东:node-webkit.用Node.js来进行系统资源的访问,用HTML+CSS完成页面的搭建.哇,一切突然 ...