美文网首页
python 建立一个简单的服务器

python 建立一个简单的服务器

作者: 谁吃了我的薯条 | 来源:发表于2017-10-09 21:38 被阅读0次

参考网易云课堂以及大牛
**TCP/IP **
首先为一张大图:

TCP/IP协议只是整个网络协议的一部分;
网络协议,其实就是:为了网络交换所建立的规则、标准和约定;
协议规定了信息传递的格式、顺序、意义和信息,以及与之相针对的收发信息所采取的动作(actions)
协议的三个要素:语法、语意和时序

网络模型划分为:
OSI 七层模型:注意在数据封装过程中,每层协议加入了一些控制信息和地址,以便找到下一个访问的地址(端到端),并且添加了一些安全性手段;

我们需要对网络传输,特别是TCP/IP协议和socket有一定的了解。socket是进程间通信的一种方法 (参考Linux进程间通信),它是基于网络传输协议的上层接口。socket有许多种类型,比如基于TCP协议或者UDP协议(两种网络传输协议)。其中又以TCP socket最为常用。TCP socket与双向管道(duplex PIPE)有些类似,一个进程向socket的一端写入或读取文本流,而另一个进程可以从socket的另一端读取或写入,比较特别是,这两个建立socket通信的进程可以分别属于两台不同的计算机。所谓的TCP协议,就是规定了一些通信的守则,以便在网络环境下能够有效实现上述进程间通信过程。双向管道(duplex PIPE)存活于同一台电脑中,所以不必区分两个进程的所在计算机的地址,而socket必须包含有地址信息,以便实现网络通信。一个socket包含四个地址信息: 两台计算机的IP地址和两个进程所使用的端口(port)。IP地址用于定位计算机,而port用于定位进程 (一台计算机上可以有多个进程分别使用不同的端口)。

** 客户端:建立一个socket连接**
以百度首页为例:

import socket

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#代表 TCP ipv4协议

s.connect(("www.baidu.com",80))
"""
   80端口是Web服务的标准端口,备注:端口号小于1024的是
   Internet标准服务的端口,端口号大于1024的,可以任意使用。
"""
s.send(b'GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: close\r\n\r\n')
# 发送数据

# 接收数据:
buffer = []
while True:
    # 每次最多接收1k字节:
    d = s.recv(1024)
    if d:
        buffer.append(d)
    else:
        break
data = b''.join(buffer)
# 关闭连接:
s.close()

header, html = data.split(b'\r\n\r\n', 1)
print(header.decode('utf-8'))
# 把接收的数据写入文件:
with open('baidu.html', 'wb') as f:
    f.write(html)

** 服务器端:建立一个本地服务器**

import socket
import time
import threading

def tcplink(sock, addr):
    print('Accept new connection from %s:%s...' % addr)
    sock.send(b'Welcome!')
    while True:
        data = sock.recv(1024)
        time.sleep(1)
        if not data or data.decode('utf-8') == 'exit':
            break
        sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
    sock.close()
    print('Connection from %s:%s closed.' % addr)


HOST = '127.0.0.1'
PORT = 9999

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # TCP-socket
s.bind((HOST, PORT))  # 赋予socket以固定的地址和端口
s.listen(5)  # 监听接口

while True:
    # 接受一个新连接:
    sock, addr = s.accept()
    # 创建新线程来处理TCP连接:
    t = threading.Thread(target=tcplink, args=(sock, addr))
    t.start()

"""
每个连接都必须创建新线程(或进程)来处理,
否则,单线程在处理连接的过程中,无法接受其他客户端的连接:
"""
sock.close()

----#下面为一个本地客户端
import socket


HOST="127.0.0.1"
PORT=9999

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((HOST,PORT))
for data in [b'Michael', b'Tracy', b'Sarah']:
    # 发送数据:
    s.send(data)
    print(s.recv(1024).decode('utf-8'))

s.close()

----运行结果:
Welcome!
Hello, Michael!
Hello, Tracy!
...

相关文章

网友评论

      本文标题:python 建立一个简单的服务器

      本文链接:https://www.haomeiwen.com/subject/stapyxtx.html