【Python】网络编程

2018-6-15
使用python进程,连接别的服务器进程的通信端口进行通信。
Socket——一条网络链接
怎么建立这条链接?需要知道目标计算机的IP地址和端口号,再指定协议类型即可。


TCP/IP简介

IP协议负责把数据从一台计算机通过网络发送到另一台计算机。数据被分割成一小块一小块,然后通过IP包发送出去。由于互联网链路复杂,两台计算机之间经常有多条线路,因此,路由器就负责决定如何把一个IP包转发出去。IP包的特点是按块发送,途径多个路由,但不保证能到达,也不保证顺序到达。
TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然后,对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。
一个TCP报文除了包含要传输的数据外,还包含源IP地址和目标IP地址,源端口和目标端口。

许多常用的更高级的协议都是建立在TCP协议基础上的,比如用于浏览器的HTTP协议、发送邮件的SMTP协议等。


TCP编程
【socket和TCP和UDP的区别和联系是什么???廖雪峰教程里似乎没有给

2018-6-21


客户端Client

基于TCP的Socket:

# 导入socket库:
import socket

# 创建一个socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('www.sina.com.cn', 80))

# 发送数据:
s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\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('sina.html', 'wb') as f:
    f.write(html)
  1. 先创建一个socket连接:
    IPv4(IPv6)协议
    一个面向流的TCP协议
    此时没有建立连接。

  2. 指定服务器的IP和端口号
    此时建立连接

  3. 向服务器发送请求—要求服务器给你东西
  4. 接收服务器返回的数据
  5. 接收完毕关闭socket
    此时一次通信结束

  6. 保存接收的数据


服务器Server
Server.py
一个服务器的进程需要一个固定的端口来监听来自客户端的连接,每来一个连接,就创建一个socket。
同时,会有不止一个客户端与服务器连接,为了不乱套,服务器就需要区分每一个socket连接。因此,socket具有四项属性:服务器地址,服务器端口,客户端地址,客户端端口。
其中前两项是为了客户端能够找到服务器而具备的,后两项是服务器区分客户端的标的。
当然,区分是必须的,那么服务器也需要能够同时与多个客户端通信,因此多线程/进程也是必须的。

# 导入socket库:
import socket
import threading
import time

# create server's socket
# 服务器也得有一个socket连接,感觉像是一个通道
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# listening port
s.bind(('127.0.0.1', 9999))
# 127.0.0.1 是专指本机地址的
s.listen(5)
# 参数'5'表示指定最大等待连接数
print('Waiting for connection...')

# 为每个连接创建一个进程/线程
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)

# 要不停的“扫描”端口,接受客户端的连接访问
while True:
    # receive a new connection:
    sock, addr = s.accept()
    # accept()功能是等待并返回一个客户端连接
    # 创建新线程来处理TCP连接:
    t = threading.Thread(target=tcplink, args=(sock, addr))
    t.start()

Client.py

# 导入socket库:
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('127.0.0.1', 9999))
# 接收欢迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Sarah']:
    # 发送数据:
    s.send(data)
    print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值