网络编程就是如何在程序中实现两台计算机的通信
1.1 UDP编程
TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对TCP,UDP则是面向无连接的协议。
使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知 道了。
虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议。
适用情况
UDP是面向消息的协议,通信时不需要建立连接,数据的传输当然是不可靠 的,UDP一般用于多点通信和实时的数据业务,例如
语音广播、视频、QQ、TFTP(简单文件传送)、SNMP(简单网络管理协议)、RIP(路由信息协议,如报告股票市场, 航空信
息)
客户端实现:
from socket import *
sc = socket(AF_INET, SOCK_DGRAM)
addr = ('127.0.0.1', 8989)
while True:
datastr = input("输入发送内容")
if datastr.__eq__("exit"):
break
dataencode = datastr.encode(encoding="utf-8")
sc.sendto(dataencode, addr)
receivecode, saddr = sc.recvfrom(1024)
receivedata = receivecode.decode(encoding="utf-8")
print(receivedata, saddr)
sc.close()
print("finish")
服务端实现:
from socket import *
ss = socket(AF_INET, SOCK_DGRAM)
saddr = ('127.0.0.1', 8989)
ss.bind(saddr)
while True:
dataencode, caddr = ss.recvfrom(1024)
datastr = dataencode.decode(encoding="utf-8")
print(datastr)
str = input("输入发送内容")
if str.__eq__("exit"):
break
strcode = str.encode(encoding="utf-8")
ss.sendto(strcode, caddr)
ss.close()
print("finish")
1.2 TCP编程
TCP三次握手:
张三首先向李四招手(syn),李四看到张三向自己招手后,向对方点了点头挤出了一个微笑(ack)。张三看到李四微笑后确认 了李
四成功辨认出了自己(进入estalished状态)。 但是李四还有点狐疑,向四周看了一看,有没有可能张三是在看别人呢,他也需要
确认一下。 所以李四也向张三招了招手(syn),张三看到李四向自己招手后知道对方是在寻求自己的确认,于是也点了点头挤出
了微笑 (ack),李四看到对方的微笑后确认了张三就是在向自己打招呼(进入established状态)。 我们看到这个过程中一共是四个
动作,张三招手--李四点头微笑--李四招手--张三点头微笑。 其中李四连续进行了2个动作,先是点头微笑(回复对方),然后再次
招手(寻求确认),实际上可以将这两个动作合一,招手 的同时点头和微笑(syn+ack)。 于是四个动作就简化成了三个动作,张三
招手--李四点头微笑并招手--张三点头微笑。这就是三次握手的本质,中间的一次 动作是两个动作的合并。
TCP四次挥手:
服务端实现:
from socket import *
ss = socket(AF_INET, SOCK_STREAM)
saddr = ('127.0.0.1', 8989)
ss.bind(saddr)
ss.listen(100)
print("服务启动了")
while True:
sc, caddr = ss.accept()
receivebytes = sc.recv(1024)
receivedata = receivebytes.decode("utf-8")
print("收到:%s" % receivedata)
sendenbytes = receivebytes
sc.send(sendenbytes)
# sc.close()
ss.close()
客户端实现:
from socket import *
sc = socket(AF_INET, SOCK_STREAM)
saddr = ('127.0.0.1', 8989)
sc.connect(saddr)
while True:
senddata = input("输入要发送的数据")
if senddata.__eq__("exit"):
sc.close()
break
sendbytes = senddata.encode("utf-8")
sc.send(sendbytes)
receivebytes = sc.recv(1024)
receivedata = receivebytes.decode("utf-8")
print(receivedata)