一.说明

对于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通信的更多相关文章

  1. 高性能 TCP & UDP 通信框架 HP-Socket v3.5.3

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  2. 高性能 TCP & UDP 通信框架 HP-Socket v3.5.2

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  3. 高性能 TCP & UDP 通信框架 HP-Socket v3.5.1

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  4. 高性能 TCP & UDP 通信框架 HP-Socket v3.4.1

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  5. 高性能 TCP & UDP 通信框架 HP-Socket v3.3.1

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  6. 高性能 TCP & UDP 通信框架 HP-Socket v3.2.3

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  7. 高性能 TCP & UDP 通信框架 HP-Socket v3.2.2 正式发布

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  8. HP-SOCKET TCP/UDP通信框架库解析

    项目概述: HP-SOCKET是一套通用TCP/UDP通信框架,包括服务器.客户端.Agent组件:其目标是提供高性能.通用性.简易性.可扩展.可定制: 鉴于此,其仅实现基本的通用框架通信.数据收发功 ...

  9. Python的网络编程[0] -> socket[2] -> 利用 socket 建立 TCP/UDP 通信

    Socket 目录 socket 的 TCP/IP 通信基本建立过程 socket 的 UDP 通信基本建立过程 socket 的 UDP 广播式通信基本建立过程 socket 的多线程通信建立过程 ...

随机推荐

  1. 开源OSS.Social微信项目解析

    ​前言:OSS.Social是个开源的社交网站接口集成项目,当前也有很多其他不错的项目,不过始终没有我想要的那种简单清晰,只能撸起袖子,从头打造一个.当前正在进行的是对微信项目的开发,这里把对接口的整 ...

  2. JAVA逻辑运算符

    逻辑运算符,用于链接boolean类型的表达式. AND与 (&)OR或 (|)XOR异或 (^)Not非 (!)AND双与短路 (&&)OR双与短路 (||) 与(& ...

  3. 手动加支付宝遇到的错误--iOS

    前言 之前调通了支付宝demo,开始往自己工程拖东西吧,我为什么觉得我可能把所以的问题都遇到了呢+_+,赶紧把问题记录下来 不然下次弄还费劲,加一句,要不真的用ping++吧

  4. SwaggerUI ASP.Net WebAPI2

    目前在用ASP.NET的 WebAPI2来做后台接口开发,在与前台做测试的时候,总是需要发送一个demo给他,但是这样很麻烦的,他还有可能记不住. 然后就想到SwaggerUI 生成测试文档. 话不多 ...

  5. IE浏览器和CSS盒模型

    网页设计中常听的属性名:内容(content).填充(padding).边框(border).边界(margin), CSS盒子模式都具备这些属性. 盒子模型是CSS中一个重要的概念,理解了盒子模型才 ...

  6. 创建Win32图形界面应用程序

    没有什么比创建一个Win32图形界面应用程序能让Win32汇编初学者更兴奋的了! 然而,对于像我这样没有代码便会陷入困境的人来说,看到下面的代码总能让人为之一振,百余行的代码使得Win32GUI编程并 ...

  7. web开发之Servlet 一

    因为最近在研究公司一套新的框架,发现这套框架的底层是对Struts2,Spring 封装后的WEB应用框架,而我发现如果仅仅是利用这个框架开发,确实很容易快速上手,做业务来说是没有问题的,但我觉得如果 ...

  8. java学习笔记之线程(Thread)

    刚开始接触java多线程的时候,我觉得,应该像其他章节的内容一样,了解了生命周期.构造方法.方法.属性.使用的条件,就可以结束了,然而随着我的深入学习了解,我发现java的多线程是java的一个特别重 ...

  9. ldd获得可执行程序的所有库并输出到指定目录

    #!/bin/bash ########################################################################## #ldd可以查看程序的库依 ...

  10. MINA、Netty、Twisted一起学(十二):HTTPS

    由于HTTPS协议是由HTTP协议加上SSL/TLS协议组合而成,在阅读本文前可以先阅读一下HTTP服务器和SSL/TLS两篇博文,本文中的代码也是由这两篇博文中的代码组合而成. HTTPS介绍 上一 ...