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 的多线程通信建立过程 ...
随机推荐
- jq返回顶部
今天发工资了,哎,更加坚定我要努力的学习,没资本,只能玩技术了.人呢,想的的开,才行,虽然有些不甘心,不过确实,现在的技术只值这个 价格.不过做到问心无愧就够了,不然人之贪婪,真的收也收不回.好了,今 ...
- 如何在NodeJS项目中优雅的使用ES6
如何在NodeJS项目中优雅的使用ES6 NodeJs最近的版本都开始支持ES6(ES2015)的新特性了,设置已经支持了async/await这样的更高级的特性.只是在使用的时候需要在node后面加 ...
- Xcode7 beta 网络请求报错:The resource could not be loaded because the App Transport
Xcode7 beta 网络请求报错:The resource could not be loaded because the App Transport Xcode7 beta 网络请求报错:The ...
- iOS页面间传值的五种方式总结(Delegate/NSNotification/Block/NSUserDefault/单例)
iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例) iOS页面间传值的方式(NSUserDefault/Delegate/NSNot ...
- Hadoop权威指南:HDFS-目录,查询文件系统,删除文件
Hadoop权威指南:HDFS-目录,查询文件系统,删除文件 [TOC] 目录 FileSystem实例提供了创建目录的方法 public boolean mkdirs(Path f) throws ...
- [css]《css揭秘》学习(四)-一个元素实现内圆角边框
如图所示的圆角边框有两个元素很好实现,用一个元素也可以实现. <html> <head> <meta charset="utf-8"> < ...
- 蓝桥网试题 java 基础练习 数列特征
----------------------------------- Collections.sort(list);是个好东西 但是要学会排列 然后你才能浪 -------------------- ...
- (@WhiteTaken)设计模式学习——抽象工厂模式
抽象工厂模式,可以向客户端提供一个接口,而客户端不用指定具体的类型创建对象,却能够创建多个产品族(一类具有共性产品,如地域等)的对象. 下面直接上代码. 1.苹果需要实现水果的接口,而苹果可以有北方的 ...
- Professional C# 6 and .NET Core 1.0 - 38 Entity Framework Core
本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处:Professional C# 6 and .NET Core 1.0 - 38 Entity Framework ...
- 微端启动器LAUNCHER的制作之MFC版二(下载)
用了C#再回来用C++写真的有一种我已经不属于这个世界的感觉.C++的下载就没有C#那么方便了,我用的是libcurl.dll,官网上下载的源码自己cmake出来编译的,c++的库引用有debug和r ...