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)
先创建一个socket连接:
IPv4(IPv6)协议
一个面向流的TCP协议
此时没有建立连接。指定服务器的IP和端口号
此时建立连接- 向服务器发送请求—要求服务器给你东西
- 接收服务器返回的数据
接收完毕关闭socket
此时一次通信结束保存接收的数据
服务器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()