udp和tcp

什么是socket
socket(套接字)是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:他能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于Socket来完成的

在Python中使用socket模块的函数socket就可以完成
import socket
socket.socket(AddressFamily,Type)
说明:
Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET
Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)
创建一个tcp socket(tcp套接字)
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket Created'
创建一个udp socket(udp套接字)
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print 'Socket Created'

UDP和TCP区别
UDP在通信开始之前,不需要建立相关的连接,只要发送数据即可,类似于生活中"写信",写上对方IP和端口即可通信
TCP在通信开始之前,一定要先建立相关的连接,才能发送数据,类似于生活中的打电话,

TCP接收发送数据:send()接收,recv()发送
UDP接收发送数据:sendto()接收,recvfrom()发送

UDP介绍:
UDP只是把应用程序传给IP层的数据送出去,但是并不能保证它们能到达目的地,由于udp在传输数据前不用再客户和服务器之间建立一个链接,没有超时重发等机制,因此传输速度快,信息能否到达目的地,到达目的地时间以及能容的正确性都是不能被保证的

发送代码:
    from socket import *
    #创建套接字
    udpSocket = socket(AF_INET,SOCK_DGRAM)
    #准备对方的地址
    sendAddr = ('192.168.133.1',8080)
    #发送给对方的数据,byte
    dendData = b"haha"
    #发送到指定的电脑上
    udpSocket.sendto(dendData,sendAddr)
    #关闭套接字
    udpSocket.close()
发送等待接收代码:
    from socket import *
    #创建套接字
    udpSocket = socket(AF_INET,SOCK_DGRAM)
    #绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配
    bindAddr = ('',7788)
    udpSocket.bind(bindAddr)

    等待接收对方发送的数据
    recvData = udpSocket.recvfrom(1024) #1024表示本次接收的最大字节
    显示接收到的数据
    print(recvData[0].decode(),recvData[1])

        #第二种接收
        # a1,a2 = udpSocket.recvfrom(1024)
        # print('%s,%s'%(a1.decode(),a2))

    #关闭套接字
    udpSocket.close()

TCP流程:
1.socket创建一个套接字
2.bind绑定ip和port
3.listen使套接字变为可以被动链接
4.accept等待客户端的链接
5.recv/send接收发送数据

tcp服务器代码:
    from socket import *
    #创建tcp的socket
    tcpSerSocket = socket(AF_INET,SOCK_STREAM)
    #绑定本地信息
    address = ('',7788)
    tcpSerSocket.bind(address)

    #使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动,这样就可以接收别人的连接了
    tcpSerSocket.listen(5)
    #如果有新的客户端来连接服务器,那么就产生一个新的套接字专门为这个客户端服务
    #也就是新创建出来的套接字对象带有着两个信息,在这里就是拆包一下
    #tcpSerSocket就可以省下来专门等待其他新客户端的连接
    #newSocket用来为这个客户端服务,clientAddr表示这个新的客户端的ip以及端口
    newSocket,clientAddr = tcpSerSocket.accept()
    #接收对方发送过来的数据,最大接收1024个字节
    recvData = newSocket.recv(1024)
    #发送一些数据到客户端
    newSocket.send("thank you!")
    #关闭客户端套接字
    newSocket.close()
    #关闭监听套接字
    tcpSerSocket.close()
tcp客户端代码:
    from socket import *
    #创建socket
    tcpClientSocket = socket(AF_INET,SOCK_STREAM)
    #连接服务器
    serAddr = ('192.168.241.131',7788)
    tcpClientSocket.connect(serAddr)
    #发送的数据
    sendData = b"haha"
    tcpClientSocket.send(sendData)
    #接收对方发送过来的数据,最大接收1024个字节
    recvData = tcpClientSocket.recv(1024)
    print('接收到的数据为:%s'%recvData.decode())
    #关闭套接字
    tcpClientSocket.close()
QQ客户端:
    from socket import *
    #创建socket
    tcpclient = socket(AF_INET,SOCK_STREAM)
    #连接服务器
    serAddr = ('192.168.133.1',9997)
    tcpclient.connect(serAddr)
    while True:
        sendData=input('输入:')
        if len(sendData)>0:
            #发送数据
            tcpclient.send(sendData.encode("utf-8"))
        else:
            break
            #接收数据,最大接收1024个字节
        recvData = tcpclient.recv(1024)
        print('接收:%s'%recvData.decode('utf-8'))
    #关闭套接字
    tcpclient.close()
QQ服务端:
    #服务端
    from socket import *
    #创建tct的socket
    tcpser = socket(AF_INET,SOCK_STREAM)
    #tcpser.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
    #绑定本地信息
    address = ('',9997)
    tcpser.bind(address)

    #使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的连接了
    tcpser.listen(5)
    while True:
        #如果有新的客户端来连接服务器,那么久产生一个新的套接字专门为这个客户端服务器
        #也就是新创建出来的套接字对象带有着两个信息,在这里就是拆包一下
        #tcpSerSocket就可以省下来专门等待其他新客户端的连接
        #newSocket用来为这个客户端服务,clientAddr表示这个新的客户端的ip以及端口
        newSocket,clientAddr = tcpser.accept()

        while True:
            #接收对方发送过来的数据,最大接收1024个字节
            recvData = newSocket.recv(1024)
            #如果接收的数据的长度为0,则意味着客户端关闭了连接
            if len(recvData)>0:
                print('接收:',recvData.decode('utf-8'))
            else:
                break
            #发送一些数据到客户端
            sendData = input('输入:')
            newSocket.send(sendData.encode('utf-8'))
        #关闭为这个客户端服务的套接字,只要关闭了,就意味着不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
        newSocket.close()
    #关闭监听套接字,只要这个套接字关闭了,就意味着整个程序不能再接收任何新的客户端的连接
    tcpser.close()

总结:
from socket import *
UDP字段
1.socket创建一个套接字(SOCK_DGRAM)
2.发送方绑定ip并发送数据sendto(b‘信息‘,(‘ip‘,端口))
3.接收方绑定bind('',端口)
4.接收数据recvfrom(1024)最大接收1024字节,拆包:信息,ip端口
5.关闭套接字
发送:
1.udpsocket = socket(AF_INET,SOCK_DGRAM) #创建套接字
2.udpsocket.sendto(b'信息',('ip',端口)) #发送数据到指定ip端口
3.udpsocket.close() #关闭套接字
接收:
2.udpsocket.bind('',端口) #绑定本地ip端口

拆包:a1是信息,a2是ip端口

a1,a2 = udpsocket.recvfrom(1024) #接收最大字节1024
print('%s,%s'%(a1.decode(),a2))

TCP字段:
1.socket创建一个套接字(SOCK_STREAM)
2.服务器绑定本地bind('',端口)
3.客户端连接服务器connect('ip',端口)
3.listen使套接字变为可以被动链接
4.accept等待客户端的链接,拆包:用来为客户端服务,这个客户度ip端口
5.接收数据recv(1024)最大接收1024字节
6.发送数据send('信息')
7.服务器关闭客户端套接字和接听套接字
8.客户端关闭套接字
客户端:
1.连接对方服务器connect('ip',端口)
2.发送数据send(b'信息')
3.接收数据recv(1024)接收最大1024字节
4.关闭套接字服务器close()
服务端:
1.绑定本地bind('',端口)
2.listen(5)套接字默认属性变为被动,接收客户端连接最大5个
3.创建新套接字为连接的客户端服务accept(),这里需要拆包
创建的新套接字有两个属性,1.用来为客户端服务,2.客户端的ip端口
4.新客户端套接字.recv(1024),接收信息
5.新客户端套接字.send('信息'),发送信息
6.新客户端套接字.close(),关闭客户端套接字
7.关闭套接字服务器close()

你可能感兴趣的:(udp和tcp)