广播数据:一台电脑发一份,多台电脑都能收到
一台电脑把数据包发送给某设备,再由这个设备发送到多台电脑上
如果允许套接字发送广播数据,要对套接字进行设置:
#coding=utf-8
import socket, sys
dest = ('<broadcast>', 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:用户报数据协议
*socket创建出来的套接字默认是主动套接字(主动给别人发消息的,listen()将主动套接字变成被动套接字,就能够接听)
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(),就代表挂了电话
多进程优化: