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 的多线程通信建立过程 ...
随机推荐
- 路由器安装ubuntu-16.04.1-server-amd64出现“无法安装busybox-initramfs”错误。向目标系统中安装busybox-initramfs软件包时出现一个错误。请检查/var/log/syslog或查看第四虚拟控制台以获得详细
公司的路由器要ubuntu服务器进行路由网络功能的管理,在安装的时候出现下面的错误提示: 安装ubuntu-16.04.1-server-amd64出现“无法安装busybox-initramfs”错 ...
- asp.net权限认证:OWIN实现OAuth 2.0 之授权码模式(Authorization Code)
asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...
- 神秘的ApplicationPoolIdentity再也不用妈妈担心程序池安全了
在IIS 7和IIS 7.5中,我们可以为应用程序池设置一个特殊的Identity(用户标识):ApplicationPoolIdentity. 那么这个标识到底是什么意思?它是具体什么身份呢?这一讲 ...
- 详解 swift2.2 和 OC 的混编
前言: 我们在一些情况下,仅仅使用swift 是无法完成一个项目的,在swift项目中必要用到 OC 实现一些功能,比如,项目要使用一些第三方的框架,但这个第三方的框架却是用 OC 实现的,或者你的项 ...
- 学习笔记--jQuery基础
学习笔记也算总结知识点,有些示例可能没有具体到元素,直接给出的语法.大家有基本理解在看可能会好些. jQuery使用前提,需要安装jQuery库 jQuery 库是一个 JavaScript 文件,您 ...
- 浅谈Java单例模式
关于基本的懒汉式,饿汉式等写法网上介绍多如牛毛,这里不再赘述,直接讨论加了volatile关键字的双重锁(Double check),静态内部类以及枚举等写法,如有不对,恳请读者指出,欢迎讨论. 1. ...
- Thrift入门初探(2)--thrift基础知识详解
昨天总结了thrift的安装和入门实例,Thrift入门初探--thrift安装及java入门实例,今天开始总结一下thrift的相关基础知识. Thrift使用一种中间语言IDL,来进行接口的定义, ...
- Visual Studio命令行创建库文件lib
Visual Studio命令行创建库文件lib OS:win7 旗舰版SP1 64位 编译器: VS 2013 express 的cl 建一个文件Static_Lib.h,源代码如下 #ifndef ...
- php与微信基础的学习
我们要搞的是用php来与微信进行信息交互,现在是一个学习过程...结合慕课网渔夫老师的讲解. 微信公众号的申请具体可百度,太简单不予说明,微信本身功能也挺多,也有相关第三方平台,然而我们学习编程--具 ...
- JavaScript内置对象-Array
▓▓▓▓▓▓ 大致介绍 除了Object之外,Array类型恐怕就是JavaScript种最常用的类型了,JavaScript中的数组与其他语言中的数组有很大的区别,例如,数组的每一项可以存放任何值, ...