Python服务器开发三:Socket

 

socket是操作系统中I/O的延续,它可以使进程和机器之间的通信成为可能。socket可以看成一个标准的文件描述符。不同的是文件需要用open()函数打开,而socket用socket()

函数建立.recv()、send()函数和read()、write()函数极为相似。

TCP一般通过accept()来为每个连接的客户端建立一个新的scoket。UDP一般只是使用一个单一的socket,完全依靠recvfrom()返回的值来判断该往哪里发送响应。

客户端:

1、建立一个socket:

//SOCK_STREAM表示TCP,SOCK_DGRAM表示UDP,AF_INET表示IPv4
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

2、连接socket

连接socket需要一个tuple参数,来提供IP和端口号:

s.connect((“www.example.com”, 80))

3、

#!/usr/bin/env python

import socket

print "Creating socket...",
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "done." print "Looking up port number...",
port = socket.getservbyname('http', 'tcp')
print "done." print "Connecting to remote host on port %d..." % port,
s.connect(("www.google.com", port))
print "done." #获取本身的IP和端口号
print "Connected from", s.getsockname()
#获取远程的IP和端口号
print "Connected to", s.getpeername()

文件类对象:

import socket, sys

port = 70
host = sys.argv[1]
filename = sys.argv[2] s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
fd = s.makefile('rw', 0) fd.write(filename + "\r\n") for line in fd.readlines():
sys.stdout.write(line)

高级接口:

import urllib, sys

f = urllib.urlopen(sys.argv[1])
while 1:
buf = f.read(2048)
if not len(buf):
break
sys.stdout.write(buf)

服务器端:

1、建立一个连接:

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

2、设置socket选项:

//socket 端口可立即复用
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

3、绑定socket:

s.bind((host, port))

4、监听:

s.listen(1)

5、接受连接:

while 1:
clientsock, clientaddr = s.accept()
print "Got connection from", clientsock.getpeername()
clientsock.close()

6、

#!/usr/bin/env python

import socket, traceback

host = ''                               # Bind to all interfaces
port = 51423 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
#这里设定每次最多只有一个等候处理的请求,真正的服务器会设置一个很高的数字。
s.listen(1) while 1:
try:
clientsock, clientaddr = s.accept()
except KeyboardInterrupt:
raise
except:
traceback.print_exc()
continue # Process the connection try:
print "Got connection from", clientsock.getpeername()
# Process the request here
except (KeyboardInterrupt, SystemExit):
raise
except:
traceback.print_exc() # Close the connection try:
clientsock.close()
except KeyboardInterrupt:
raise
except:
traceback.print_exc()

使用UDP:

#!/usr/bin/env python

import socket, traceback

host = ''                               # Bind to all interfaces
port = 51423 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port)) while 1:
try:
message, address = s.recvfrom(8192)
print "Got data from", address
# Echo it back
s.sendto(message, address)
except (KeyboardInterrupt, SystemExit):
raise
except:
traceback.print_exc()

Python服务器开发三:Socket的更多相关文章

  1. Python服务器开发 -- 网络基础

    Python服务器开发 -- 网络基础   网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.HTTP是高层协议,而TCP/IP是个协议集,包过许多的子协议.... 网络由下 ...

  2. Python服务器开发二:Python网络基础

    Python服务器开发二:Python网络基础   网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. HTTP是高层协议,而TCP/IP是个协议集,包过许多的子协议.包括: ...

  3. Python服务器开发一:python基础

    Python服务器开发一:python基础   Python(蟒蛇)是一种动态解释型的编程语言.Python可以在Windows.UNIX.MAC等多种操作系统上使用,也可以在Java..NET开发平 ...

  4. Python服务器开发 -- 网络基础-乾颐堂

    网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. HTTP是高层协议,而TCP/IP是个协议集,包过许多的子协议.包括:传输层的 FTP,UDP,TCP协议等,网络层的ip ...

  5. linux服务器开发三(网络编程)

    网络基础 协议的概念 什么是协议 从应用的角度出发,协议可理解为"规则",是数据传输和数据的解释的规则. 假设,A.B双方欲传输文件.规定: 第一次,传输文件名,接收方接收到文件名 ...

  6. python web开发遇到socket.error[errno 10013]

    socket.error[errno 10013],端口被占用 重新换一个端口,或者把占用该端口的程序关闭就可以了

  7. Python自动化开发(三):循环次数控制、常用数据类型、字符串格式化、列表常用操作、列表的后续操作

    计数器的作用可以在死循环中,符合条件的情况下做自动退出中断 #!/usr/bin/env python # _*_ coding: utf-8 _*_ # @Time : 2017/3/14 11:2 ...

  8. python socket编程---从使用Python开发一个Socket示例说到开发者的思维和习惯问题

    今天主要说的是一个开发者的思维和习惯问题. 思维包括编程的思维和解决一个具体问题的分析思维,分析思路,分析方法,甚至是分析工具. 无论是好习惯还是不好的习惯,都是在者一天一天的思维中形成的.那些不好的 ...

  9. Python 全栈开发十 socket网络编程

    一.客户端(client)服务端(sever)架构 在计算机中有很多常见的C/S架构,例如我们的浏览器是客户端.而百度网站和其他的网站就是服务端:视频软件是客户端,提供视频的腾讯.优酷.爱奇艺就是服务 ...

随机推荐

  1. 安装mangodb

    1.配置yum源 [root@www ~]# cat /etc/yum.repos.d/mongodb-org-3.4.repo [mongodb-org-3.4] name=MongoDB Repo ...

  2. Tensorflow 安装 和 初识

    Windows中 Anaconda,Tensorflow 和 Pycharm的安装和配置   https://blog.csdn.net/zhuiqiuzhuoyue583/article/detai ...

  3. 解决某些软件无法在parallels desktop虚拟机下运行

    步骤1.打开注册表,点开始菜单,点运行,输入regedit.exe后回车 步骤2.找到HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System 步骤3.找到右边的V ...

  4. js实现动画(移动方块)

    1.使方块移动 源码 : <script type="text/javascript">    var div = document.createElement('di ...

  5. 思考--PostgreSQL在与mysql的比较中稍微弱势项

    PostgreSQL在与mysql的比较中稍微弱势项: 1.都是堆表,没有所谓的聚集索引表,其实问题不大,聚集索引表也只是在使用聚集索引那些列有加速,而且pg也有聚集索引,只不过要定期重建. 2.mv ...

  6. C++中前置操作符和后置操作符的重载

    1,C 语言中讨论了原生含义,C++ 中有必要考虑前置.后置操作符能够重载,有何问题: 2,值得思考的问题: 1,下面的代码有没有区别?为什么? 1,i++  // i 的值作为返回值,i 自增 1: ...

  7. [CF750G] New Year and Binary Tree Paths

    目录 简单的 组合的 题目链接 简单的 设从节点\(x\)开始不断往左儿子走h-1步,则编号和为\(x\sum_{i=0}^{h-1}2^i=x(2^h-1)\). 若倒数第\(i\)步走向的是右儿子 ...

  8. laravel框架之即點即改

    //控制器層 public function ajaxsex(request $request) { $id = $request->get('id'); $fd = $request-> ...

  9. Codeforces 1215F. Radio Stations

    传送门 题目看一半:"woc 裸的 $2-sat$ 白给??" 看完以后:"...???" 如果没有 $f$ 的限制,那就是个白给的 $2-sat$ 问题,但是 ...

  10. iframe 页面嵌套

    由于目前项目基础界面,业务逻辑一样,只是细微有所差别.因而使用iframe来进行定制化处理. 如何来区分不同需求不同页面呢? 最初是想通过url携带参数来进行区分,但是随着需求变多,定制化也越来越细微 ...