【Python】socket 编程初探

一 简介
  socket是两个应用程序进行通信的管道,这两个应用程序可以在同一台机器上,也可以位于两台不同的机器上,相同的网络或者不同网络之间的。Python  socket有丰富的类和方法,可以简化socket编程。本文算是一个学习笔记。
二  socket 
2.1 socket类型


socket.AF_UNIX 


只能够用于单一的Unix系统进程间通信


socket.AF_INET 


服务器之间网络通信


socket.AF_INET6 


用于IPv6网络的通信


socket.SOCK_STREAM


流式socket , for TCP


socket.SOCK_DGRAM 


数据报式socket , for UDP


socket.SOCK_RAW


原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。


socket.SOCK_SEQPACKET 


可靠的连续数据包服务

例子
创建TCP Socket:
import socket
tcpSerSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
创建UDP Socket:
tcpSerSock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
注意点:
1)TCP发送数据时,已建立好TCP连接,所以不需要指定地址。UDP是面向无连接的,每次发送要指定是发给谁。
2)服务端与客户端不能直接发送列表,元组,字典。需要字符串化repr(data)。

2.2 socket函数 
服务端socket函数


socket.bind(address)   


将套接字绑定到地址, 在AF_INET下,以元组(host,port)的形式表示地址.


socket.listen(backlog)


开始监听TCP传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1。


socket.accept()


接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。

客户端socket函数


socket.connect(address) 


连接到address处的套接字。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。


socket.connect_ex(adddress)


功能与connect(address)相同,但是成功返回0,失败返回errno的值。

公用函数


socket.recv(bufsize[,flag])


接受TCP套接字的数据。数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。


socket.send(string[,flag]) 


发送TCP数据。将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。


socket.sendall(string[,flag])


完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。


socket.recvfrom(bufsize[.flag])


接受UDP套接字的数据。与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。


socket.sendto(string[,flag],address)


发送UDP数据。将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。


socket.close()


关闭套接字。


socket.getpeername()


返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。


socket.getsockname()


返回套接字自己的地址。通常是一个元组(ipaddr,port)


socket.setsockopt(level,optname,value)


设置给定套接字选项的值。


socket.getsockopt(level,optname[.buflen])


返回套接字选项的值。


socket.settimeout(timeout)


设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect())


socket.fileno()


返回套接字的文件描述符。


socket.setblocking(flag)


如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv


socket.makefile()


创建一个与该套接字相关连的文件

三 创建socket连接
服务端
1 创建socket对象。
  tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2 使用bind方法来将socket绑定到指定地址和端口。
  tcpSock.bind(address,port)
3 使用listen方法接收连接请求。
  tcpSock.listen( backlog )
  backlog指定最多允许多少个客户连接到服务器。它的值至少为1。收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。
4 通过socket的accept方法等待客户请求连接。
  connection, address = socket.accept()
  调用accept方法时,socket会时入"waiting"状态,等待客户请求连接,当客户端发送请求到服务端时,accept方法建立连接并返回服务器。accept方法返回一个含有两个元素的 元组(connection,address)。
  第一个元素 connection是新的socket对象,服务器必须通过它与客户通信;
  第二个元素 address是客户的IP地址。
5 处理阶段,服务器和客户端通过send和recv方法通信(传输数据)。服务器调用send方法以字符串形式向客户发送数据,也可以使用recv方法从客户接收信息。调用recv时,
服务器必须设置接收的最大数据量。recv方法在接收数据时会进入“blocked”状态,最后返回一个字符串,用它表示收到的数据。
如果发送的数据量超过recv所允许接收的限制,数据会被截断。多余的数据将缓冲于接收端。下一次调用recv时,多余的数据会从缓冲区删除(以及自上次调用recv以来,客户可能发送的其它任何数据)
6 传输结束,服务器调用socket的close方法关闭连接。
客户端
1 创建一个socket以连接服务器,和服务器端创建socket对象一样。
  tcpCliSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
2 使用socket的connect方法连接服务器。
  tcpCliSock.connect( (host,port) )
  host代表服务器主机名或IP,port代表服务器进程所绑定的端口号。如连接成功,客户就可通过套接字与服务器通信,如果连接失败,会引发socket.error异常。
3 处理阶段,客户和服务器将通过send方法和recv方法通信。
  tcpCliSock.send(data) 
4 传输结束,客户通过调用socket的close方法关闭连接。
  tcpCliSock.close()
一图胜千言 ,socket 建立连接的过程 via 

图片来自于 《socket 套接字
四 talk is cheap ,show me the code .
代码实现了一个client 端通过socket 向 server端发送信息的程序,

#coding:utf8

import socket

from time import ctime

HOST=''

PORT=9999

BUFSIZE=1024

ADDR=(HOST,PORT)

tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

tcpSock.bind(ADDR)

tcpSock.listen(5)

while True:

    print 'waiting for connection ....'

    tcpCliSock,addr = tcpSock.accept()

    print '...connected from ',addr

    while True:

        data = tcpCliSock.recv(BUFSIZE)

        if not data:

            break

        elif data == 'exit':

            tcpCliSock.send('see you agine')

            tcpCliSock.close()

            exit(0)

        tcpCliSock.send('%s, %s ' %(ctime(),data))

        print [ctime()],':',data

tcpCliSock.close()

tcpSock.close()

exit(0)
#coding:utf8

import socket

HOST= '10.0.2.6' #server 主机ip

PORT=9999

BUFSIZE=1024

ADDR=(HOST,PORT)

tcpCliSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

tcpCliSock.connect(ADDR)

while True:

    try:

        data = raw_input('>')

        if not data :

            break

        tcpCliSock.send(data)

        data = tcpCliSock.recv(BUFSIZE)

        if not data:

            break

        print '%s say: %s' %(HOST,data)

        if data == 'see you agine':

            exit(0)

    except (KeyboardInterrupt, SystemExit):

        tcpCliSock.close()

        exit(0)

时间: 2024-09-23 08:32:46

【Python】socket 编程初探的相关文章

Python socket编程实例详解

  本文实例形式较为详细的讲述了Python socket编程.分享给大家供大家参考.具体如下: 复制代码 代码如下: sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 上面的代码创建了一个socket对象.type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字).AF_INET表示创建的是ip v4的类型. 复制代码 代码如下: socket(address_family,type,pro

Python Socket 编程——聊天室示例程序

原文:Python Socket 编程--聊天室示例程序 上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的理解. 聊天室程序需求 我们要实现的是简单的聊天室的例子,就是允许多个人同时一起聊天,每个人发送的消息所有人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天.如下图: 图来自:http://www.ibm.com/de

Python Socket编程入门教程_python

这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs.python.org/library/socket.html 基本上,Socket 是任何一种计算机网络通讯中最基础的内容.例如当你在浏览器地址栏中输入 www.jb51.net 时,你会打开一个套接字,然后连接到 www.jb51.net 并读取响应的页面然后然后显示出来.而其他一些聊天客户端如

python Socket 编程 errno 10061 错误如何解决

python代码在访问网络的时候老出现errno 10061的错误,根源还是代理的问题. 错误的意思大约是:10061 因为目标主机主动拒绝,连接不能建立.这通常是因为试图连接到一个远程主机上不活动的服务,如没有服务器应用程序处于执行状态. 造成错误的可能原因:目标服务器主动拒绝,防火墙,路由设置问题,代理(本文要处理的) 因为开了代理,没有恢复过来,解决方法步骤如下: 打开IE浏览器-> 依次选择工具?Internet选项?连接?局域网设置,取消代理服务器复选框 去掉勾选之后,再进连接,错误问

Python Socket 网络编程

原文:Python Socket 网络编程 Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ 聊天.收发 email 等等.要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,就有了通信的基础了. 本文主要介绍使用 Python 进

Python Socket Client及Server简单编程

本文主要介绍使用Python语言编写Socket协议Server及Client的简单实现方法. 1. Python Socket编程简介 Socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 三种流行的套接字类型是:stream,datagram和raw.stream和datagram套接字可以直接与TCP协议进行接口,而raw套接字则接口到IP协议. Python Socket模块提供了对低层BSD套接字样式网络的访问,使用

最基础的Python的socket编程入门教程_python

本文介绍使用Python进行Socket网络编程,假设读者已经具备了基本的网络编程知识和Python的基本语法知识,本文中的代码如果没有说明则都是运行在Python 3.4下. Python的socket功能封装在socket库中,要使用socket,记得先import socket,socket库的详细介绍参见官方文档.创建Socket 首先创建一个socket,使用socket库中得socket函数创建. import socket # create an INET, STREAM sock

Socket编程三

客户端 using System.Windows.Forms;using System.Net;using System.Threading;using System.Net.Sockets;namespace QQ{ public partial class Socketclient : Form { public Socketclient() { InitializeComponent(); } private void button1_Click(object sender, EventA

Socket编程二

客户端 using System.Windows.Forms;using System.Net.Sockets;using System.Threading;using System.IO;using System.Net;//使用IPAredd类,IPHostEntry类namespace QQ{ public partial class Tcpclient : Form { private StreamWriter write; private NetworkStream stream; p