2018-05-08广播、TCP

广播数据:一台电脑发一份,多台电脑都能收到
一台电脑把数据包发送给某设备,再由这个设备发送到多台电脑上

2018-05-08广播、TCP_第1张图片
广播

2018-05-08广播、TCP_第2张图片
单播多播和广播

如果允许套接字发送广播数据,要对套接字进行设置:


#coding=utf-8

import socket, sys

dest = ('', 7788)

# 创建udp套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 对这个需要发送广播数据的套接字进行修改设置,否则不能发送广播数据
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST,1)

# 以广播的形式发送数据到本网络的所有电脑中
s.sendto("Hi", dest)

print "等待对方回复(按ctrl+c退出)"

while True:
    (buf, address) = s.recvfrom(2048)
    print "Received from %s: %s" % (address, buf)

TCP

网络中的传输协议:UDP和TCP
TCP:传输控制协议
UDP:用户报数据协议

2018-05-08广播、TCP_第3张图片
TCP和UDP的一些区别

*socket创建出来的套接字默认是主动套接字(主动给别人发消息的,listen()将主动套接字变成被动套接字,就能够接听)
2018-05-08广播、TCP_第4张图片
TCP建立通信的流程

tcp服务器

如同上面的电话机过程一样,在程序中,如果想要完成一个tcp服务器的功能,需要的流程如下:

socket创建一个套接字
bind绑定ip和port
listen使套接字变为可以被动链接
accept等待客户端的链接
recv/send接收发送数据
一个很简单的tcp服务器如下:

#coding=utf-8
from socket import *

# 创建socket
tcpSerSocket = socket(AF_INET, SOCK_STREAM)

# 绑定本地信息
address = ('', 7788)
tcpSerSocket.bind(address)

# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
tcpSerSocket.listen(5)

# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务器
# newSocket用来为这个客户端服务
# tcpSerSocket就可以省下来专门等待其他新客户端的链接
newSocket, clientAddr = tcpSerSocket.accept()

# 接收对方发送过来的数据,最大接收1024个字节
recvData = newSocket.recv(1024)
print '接收到的数据为:',recvData

# 发送一些数据到客户端
newSocket.send("thank you !")

# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
newSocket.close()

# 关闭监听套接字,只要这个套接字关闭了,就意味着整个程序不能再接收任何新的客户端的连接
tcpSerSocket.close()

TCP客户端构建:

#coding=utf-8
from socket import *

# 创建socket
tcpClientSocket = socket(AF_INET, SOCK_STREAM)

# 链接服务器
serAddr = ('192.168.1.102', 7788)
tcpClientSocket.connect(serAddr)

# 提示用户输入数据
sendData = raw_input("请输入要发送的数据:")

tcpClientSocket.send(sendData)

# 接收对方发送过来的数据,最大接收1024个字节
recvData = tcpClientSocket.recv(1024)
print '接收到的数据为:',recvData

# 关闭套接字
tcpClientSocket.close()

一方调用了close(),就代表挂了电话


2018-05-08广播、TCP_第5张图片
调用close()发了空数据

多进程优化:


2018-05-08广播、TCP_第6张图片
多进程

你可能感兴趣的:(2018-05-08广播、TCP)