网络编程



1. 网络基础

概念:IP, PORT, DOMAIN, URL(uniform resource locator), API(application program interface)

通讯协议:tcp, udp

常用协议:http, smtp, ssh, telnet …

参考:http://blog.csdn.net/jmq_0000/article/details/7091142

2. socket编程

2.1 client/server

文件: server.py

# coding:utf-8

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 各项参数意义:
# socket.socket(family, type)
# family:
#   - AF_INET, IPV4-Address
#   - AF_UNIX, Local communication
# type:
#   - SOCK_STREAM, TCP
#   - SOCK_DGRAM, UDP
#   - SOCK_RAW, 原始数据包

host = '127.0.0.1'
port = 8881
s.bind((host, port))
# 对于ipv4 socket,bind函数接受一个ip地址和端口组成的tuple

print (host, port)
s.listen(5)
# socket.socket.listen([backlog])
# backlog用来限定同时处理的连接
# backlog最小是0,如果传入的值小于0,则修正为0

while True:
    print 'wait'
    c, addr = s.accept()
    # socket.socket.accept()返回(socket object, address info)
    # 对于ipv4的socket连接,address info为ip地址和端口的tuple

    print 'Got connection from', addr
    c.send('Thank you for connecting')
    c.close()

文件: client.py

# coding:utf-8

import socket

s = socket.socket()

host = '127.0.0.1'
port = 8881

s.connect((host, port))
print s.recv(1024)
# recv(bufsize[, flags])
# bufsize指定了一次可以传输数据的最大数量

2.2 browser/server模式

文件: simple_webserver.py

# coding:utf-8

import sys
import socket

HOST = '127.0.0.1'
PORT = 10001

CONTENT = """
HTTP/1.1 200 OK
Server: huyang/1.0
Content-Type: text/html; charset=utf-8
Content-Length: 1000

<html>
<head>
<title>hello socket programming</title>
</head>
<body>
I'm Body
</body>
</html>
"""


def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen(10)
    while 1:
        try:
            conn, addr = s.accept()
        except KeyboardInterrupt:
            conn.close()
            s.close()
            sys.exit()

        print 'Connected by', addr
        data = conn.recv(1024)
        if not data:
            break
        print data
        conn.send(CONTENT)

    conn.close()
    s.close()


if __name__ == "__main__":
    main()

和c/s端的主要区别就是返回的内容CONTENT中增加了http的header

3. 使用内置的SocketServer编程

# coding:utf-8

from SocketServer import TCPServer, StreamRequestHandler


class Handler(StreamRequestHandler):
    def handle(self):
        addr = self.request.getpeername()
        print 'connection from', addr
        self.wfile.write('Hi, Everyone')


server = TCPServer(('', 10002), Handler)
server.serve_forever()

4 urllib的使用

urllib vs urllib2

# coding:utf-8

import urllib


page = urllib.urlopen('http://m.sohu.com')
print page.read()

url介绍:

推荐:requests

5. 处理并发的机制介绍

三种:

使用SocketServer提供的Fork, Thread机制。

http server:

6. 手工fork和thread的使用

Python提供多进程的包multiprocessing,可以像写线程一样写多进程代码。

推荐书籍《Python网络编程基础》

代码:https://coding.net/u/the5fire/p/PyCode/git/tree/webserver/21

7. 扩展:socket补充说明

7.1 socket几个重要的接口

7.2 thread几个重要的接口