Chinaunix首页 | 论坛 | 博客
  • 博客访问: 123563
  • 博文数量: 83
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 585
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-13 10:26
个人简介

- 毅力与勇气是事业的双飞翼; - 在尝试中成长,在失败中奋起。 - 概览 -> 细读 -> 概览 - 书不在多,在于精。

文章分类

全部博文(83)

文章存档

2016年(2)

2015年(6)

2014年(75)

我的朋友

分类: Python/Ruby

2014-07-07 15:21:08

转自: http://openexperience.iteye.com/blog/145701

python socket 模块
python 编写server的步骤:
  1. 第一步是创建socket对象。调用socket构造函数。如:

    socket = socket.socket( family, type )

    family参数代表地址家族,可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信。
    type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。

  2. 第二步是将socket绑定到指定地址。这是通过socket对象的bind方法来实现的:

    socket.bind( address ) 

    由AF_INET所创建的套接字,address地址必须是一个双元素元组,格式是(host,port)。host代表主机,port代表端口号。如果端口号正在使用、主机名不正确或端口已被保留,bind方法将引发socket.error异常。

  3. 第三步是使用socket套接字的listen方法接收连接请求。

    socket.listen( backlog )

    backlog指定最多允许多少个客户连接到服务器。它的值至少为1。收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。

  4. 第四步是服务器套接字通过socket的accept方法等待客户请求一个连接。

    connection, address = socket.accept()

    调 用accept方法时,socket会时入“waiting”状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回一个含有两个元素的 元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素 address是客户的Internet地址。

  5. 第五步是处理阶段,服务器和客户端通过send和recv方法通信(传输 数据)。服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recv方法从客户接收信息。调用recv 时,服务器必须指定一个整数,它对应于可通过本次方法调用来接收的最大数据量。recv方法在接收数据时会进入“blocked”状态,最后返回一个字符 串,用它表示收到的数据。如果发送的数据量超过了recv所允许的,数据会被截短。多余的数据将缓冲于接收端。以后调用recv时,多余的数据会从缓冲区 删除(以及自上次调用recv以来,客户可能发送的其它任何数据)。
  6. 传输结束,服务器调用socket的close方法关闭连接。
python编写client的步骤:
  1. 创建一个socket以连接服务器:socket = socket.socket( family, type )
  2. 使用socket的connect方法连接服务器。对于AF_INET家族,连接格式如下:

    socket.connect( (host,port) )

    host代表服务器主机名或IP,port代表服务器进程所绑定的端口号。如连接成功,客户就可通过套接字与服务器通信,如果连接失败,会引发socket.error异常。

  3. 处理阶段,客户和服务器将通过send方法和recv方法通信。
  4. 传输结束,客户通过调用socket的close方法关闭连接。
下面给个简单的例子:
server.py 
python 代码

点击(此处)折叠或打开

  1. if __name__ == '__main__':
  2.     import socket
  3.     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  4.     sock.bind(('localhost', 8001))
  5.     sock.listen(5)
  6.     while True:
  7.         connection,address = sock.accept()
  8.         try:
  9.             connection.settimeout(5)
  10.             buf = connection.recv(1024)
  11.             if buf == '1':
  12.                 connection.send('welcome to server!')
  13.             else:
  14.                 connection.send('please go out!')
  15.         except socket.timeout:
  16.             print 'time out'
  17.         connection.close()
client.py
python 代码

点击(此处)折叠或打开

  1. if __name__ == '__main__':
  2.     import socket
  3.     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  4.     sock.connect(('localhost', 8001))
  5.     import time
  6.     time.sleep(2)
  7.     sock.send('1')
  8.     print sock.recv(1024)
  9.     sock.close()

在终端运行server.py,然后运行clien.py,会在终端打印“welcome to server!"。如果更改client.py的sock.send('1')为其它值在终端会打印”please go out!“,更改time.sleep(2)为大于5的数值, 服务器将会超时。


Python Socket学习

转自:http://www.cnblogs.com/GarfieldTom/archive/2012/12/16/2820143.html

Python在网络通讯方面功能强大,学习一下Socket通讯的基本方式

UDP通讯:

Server:

点击(此处)折叠或打开

  1. import socket
  2. port=8081
  3. s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  4. #从指定的端口,从任何发送者,接收UDP数据
  5. s.bind(('',port))
  6. print('正在等待接入...')
  7. while True:
  8.     #接收一个数据
  9.     data,addr=s.recvfrom(1024)
  10.     print('Received:',data,'from',addr)

Client:

点击(此处)折叠或打开

  1. import socket
  2. port=8081
  3. host='localhost'
  4. s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  5. s.sendto(b'hello,this is a test info !',(host,port))

很简单 。下面是TCP方式:

Server:

点击(此处)折叠或打开

  1. #-*- coding: utf-8 -*-
  2. from socket import *
  3. from time import ctime

  4. HOST=''
  5. PORT=12345
  6. BUFSIZ=1024
  7. ADDR=(HOST, PORT)
  8. sock=socket(AF_INET, SOCK_STREAM)

  9. sock.bind(ADDR)

  10. sock.listen(5)
  11. while True:
  12.     print('waiting for connection')
  13.     tcpClientSock, addr=sock.accept()
  14.     print('connect from ', addr)
  15.     while True:
  16.         try:
  17.             data=tcpClientSock.recv(BUFSIZ)
  18.         except:
  19.             print(e)
  20.             tcpClientSock.close()
  21.             break
  22.         if not data:
  23.             break
  24.         s='Hi,you send me :[%s] %s' %(ctime(), data.decode('utf8'))
  25.         tcpClientSock.send(s.encode('utf8'))
  26.         print([ctime()], ':', data.decode('utf8'))
  27. tcpClientSock.close()
  28. sock.close()

Client:

点击(此处)折叠或打开

  1. #-*- coding: utf-8 -*-
  2. from socket import *

  3. class TcpClient:
  4.     HOST='127.0.0.1'
  5.     PORT=12345
  6.     BUFSIZ=1024
  7.     ADDR=(HOST, PORT)
  8.     def __init__(self):
  9.         self.client=socket(AF_INET, SOCK_STREAM)
  10.         self.client.connect(self.ADDR)

  11.         while True:
  12.             data=input('>')
  13.             if not data:
  14.                 break
  15.             self.client.send(data.encode('utf8'))
  16.             data=self.client.recv(self.BUFSIZ)
  17.             if not data:
  18.                 break
  19.             print(data.decode('utf8'))
  20.             
  21. if __name__ == '__main__':
  22.     client=TcpClient()

 上面的TCP方式有个问题,不能退出,好吧,我们改造一下,使这个程序可以发送quit命令以退出:

Server:

点击(此处)折叠或打开

  1. #-*- coding: utf-8 -*-
  2. from socket import *
  3. from time import ctime
  4. from time import localtime
  5. import time

  6. HOST=''
  7. PORT=1122 #设置侦听端口
  8. BUFSIZ=1024
  9. ADDR=(HOST, PORT)
  10. sock=socket(AF_INET, SOCK_STREAM)

  11. sock.bind(ADDR)

  12. sock.listen(5)
  13. #设置退出条件
  14. STOP_CHAT=False
  15. while not STOP_CHAT:
  16.     print('等待接入,侦听端口:%d' % (PORT))
  17.     tcpClientSock, addr=sock.accept()
  18.     print('接受连接,客户端地址:',addr)
  19.     while True:
  20.         try:
  21.             data=tcpClientSock.recv(BUFSIZ)
  22.         except:
  23.             #print(e)
  24.             tcpClientSock.close()
  25.             break
  26.         if not data:
  27.             break
  28.         #python3使用bytes,所以要进行编码
  29.         #s='%s发送给我的信息是:[%s] %s' %(addr[0],ctime(), data.decode('utf8'))
  30.         #对日期进行一下格式化
  31.         ISOTIMEFORMAT='%Y-%m-%d %X'
  32.         stime=time.strftime(ISOTIMEFORMAT, localtime())
  33.         s='%s发送给我的信息是:%s' %(addr[0],data.decode('utf8'))
  34.         tcpClientSock.send(s.encode('utf8'))
  35.         print([stime], ':', data.decode('utf8'))
  36.         #如果输入quit(忽略大小写),则程序退出
  37.         STOP_CHAT=(data.decode('utf8').upper()=="QUIT")
  38.         if STOP_CHAT:
  39.             break
  40. tcpClientSock.close()
  41. sock.close()

Client:

点击(此处)折叠或打开

  1. #-*- coding: utf-8 -*-
  2. from socket import *

  3. class TcpClient:
  4.     #测试,连接本机
  5.     HOST='127.0.0.1'
  6.     #设置侦听端口
  7.     PORT=1122
  8.     BUFSIZ=1024
  9.     ADDR=(HOST, PORT)
  10.     def __init__(self):
  11.         self.client=socket(AF_INET, SOCK_STREAM)
  12.         self.client.connect(self.ADDR)

  13.         while True:
  14.             data=input('>')
  15.             if not data:
  16.                 break
  17.             #python3传递的是bytes,所以要编码
  18.             self.client.send(data.encode('utf8'))
  19.             print('发送信息到%s:%s' %(self.HOST,data))
  20.             if data.upper()=="QUIT":
  21.                 break
  22.             data=self.client.recv(self.BUFSIZ)
  23.             if not data:
  24.                 break
  25.             print('从%s收到信息:%s' %(self.HOST,data.decode('utf8')))
  26.             
  27.             
  28. if __name__ == '__main__':
  29.     client=TcpClient()

 

注:以上代码为Python3。




Python的Socket模块简单使用

转自:
1、使用socket模块编写UDP服务端,代码如下。从中需要注意的知识是:bind()和connect()函数都只有一个参数,参数是表示地址的元组(hostname,port),千万不要写成两个参数了。
UDP服务端,代码如下:

点击(此处)折叠或打开

  1. #! /usr/bin/env python
  2. #coding=utf-8
  3. #使用socket模块编写的服务器(通过UDP传输数据)
  4. import socket
  5. s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  6. s.bind(("",10000)) #bind函数只有一个参数
  7. while True:
  8.     data,client=s.recvfrom(1024)
  9.     print "receive a connection from %s" %str(client) #str()函数可以将元组转换成字符串形式
  10.     #回显
  11.     s.sendto("echo:"+data,client)

2、使用socket模块编写的UDP客户端代码

点击(此处)折叠或打开

  1. #! /usr/bin/env python
  2. #coding=utf-8
  3. #客户端,基于UDP协议
  4. import socket
  5. s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  6. s.sendto("hello",("localhost",10000))
  7. data,addr=s.recvfrom(1024)
  8. print "receive data:%s from %s" %(data,str(addr))


3、使用socket模块编写的TCP服务端

点击(此处)折叠或打开

  1. #! /usr/bin/env python
  2. #coding=utf-8
  3. import socket
  4. s=socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
  5. #也可以使用s=socket.socket()来通过默认参数来生成TCP的流套接字
  6. #host='' host可以为空,表示bind()函数可以绑定在所有有效地地址上
  7. host="localhost"
  8. port=1235
  9. s.bind((host,port)) #注意,bind函数的参数只有一个,是(host,port)的元组
  10. s.listen(3)
  11. while True:
  12.     client,ipaddr=s.accept()
  13.     print "Got a connect from %s" %str(ipaddr)
  14.     data=client.recv(1024)
  15.     print "receive data:%s" %data
  16.     client.send("echo:"+data)
  17.     client.close()

4、使用socket模块编写的TCP客户端;

点击(此处)折叠或打开

  1. #! /usr/bin/env python
  2. #coding=utf-8
  3. import socket
  4. s=socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
  5. #服务器的主机名和端口

  6. host="localhost"
  7. port=1235
  8. s.connect((host,port))
  9. s.send("i am client")
  10. data=s.recv(1024)
  11. print "Reply from server-----%s" %data


阅读(629) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~