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 的多线程通信建立过程 ...
随机推荐
- Linux笔记(十三) - 系统管理
(1)进程管理1.判断服务器健康状态2.查看进程a.查看系统中所有进程:ps 例:ps aux(使用BSD操作系统命令格式) a 显示所有前台进程 x 显示所有后台进程 u 显 ...
- vue-router跳转页面
小结放在前:先祝大家新年快乐!鸡年大吉大利!在新的一年里大家都有跳跃般的成长!作为新年的第一篇文章,就拿他来给大家拜个年!!!文章前部份讲解了vue-router路由的配置,后半部分为去年的文章vue ...
- 如何用webbrowser获取ajax动态生成的网页的源码?
1.步骤一:修改IE内核的版本(这个方法厉害了) public Form1() { InitializeComponent();int BrowserVer, RegVal; // get the i ...
- JAVA版A星算法实现
import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collections; import java.u ...
- Java多线程程序休眠、暂停与停止
休眠 在Java多线程中,可以使用sleep()方法在指定毫秒数内让当前正在执行的线程休眠. 下面这段代码,使得主函数的main线程休眠了2000ms,最后输出的间隔时间也是2000ms. p ...
- 浅谈 MVC中的ViewData、ViewBag和TempData
ViewBag和TempData的区别 ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从Asp.net MVC 1 就有了 ASP.NET MVC3 才 ...
- 根据dba_hist_osstat统计CPU占用情况
在11g里面,视图dba_hist_osstat用来记录OS级别的time时间指标.视图dba_hist_osstat_name显示了相关的指标名称. SYS@/dzgddb> select * ...
- 深入理解ajax系列第四篇——请求实例
前面的话 在使用ajax的过程中,常用的请求方式是GET和POST两种.本文将以实例的形式来详细说明这两种请求方式 GET GET是最常见的请求类型,最常用于向服务器查询某些信息.必要时,可以将查询字 ...
- 批量删除的PHP
第一个页面shanchu.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...
- js:如何在循环异步请求的每次返回中添加想要的值
先看一个场景 var arr = ["a","b","c"]; for (var i in arr) { $.get(&qu ...