zoukankan      html  css  js  c++  java
  • 十八、网络编程

    1.   ip地址由网络号和主机号组成,C类网络第一个区间是110开头,及192到208之间。私有地址192.168.0.0到192.168.255.255。端口是0-65535,不要使用0到1023之内有特殊指定的,我们在指定端口的时候,不需要使用。
    2.   Socket是传输层供给应用层的编程接口。TCP协议需要建立专门的虚拟连接,发送的可靠数据。UDP则不需要建立连接,直接一端发送就可以了。
     
    '''
    udp发送数据
    '''
    #导入模块
    from socket import socket,AF_INET,SOCK_DGRAM
    udp_socket = socket(AF_INET,SOCK_DGRAM)
    #创建地址
    addr=('192.168.237.1',8080)
    #发送信息
    sendinfo =input('发送的内容:')
    #调用sendto方法进行发送
    udp_socket.sendto(sendinfo.encode('gb2312'),addr)
    #关闭socket接口
    udp_socket.close()
    '''
    upd发送数据,接收数据
    '''
    from socket import *
    udp_socket =socket(AF_INET,SOCK_DGRAM)
    #对端地址
    addr=('192.168.237.1',8080)
    #接收信息则需要绑定地址
    udp_socket.bind(('',8989))
    #对端接收信息
    data =input("请输入你要发送的内容:")
    #使用sendto发送数据
    udp_socket.sendto(data.encode('gb2312'),addr)
    #接收信息的大小
    reve_data=udp_socket.recvfrom(1024)
    print('接收到%s的信息是:%s'%(reve_data[1],reve_data[0].decode('gb2312')))
    #关闭socket
    udp_socket.close()
    3.TFTP,简单文件传输协议,实现客户端与服务器文件传输,tftp是69端口,基于udp协议。因为服务器一般都是可靠的,所以基于TFTP协议,那么实现编写的就是TFTP客户端。
    '''
    TFTP下载编程
    '''
    import struct
    from socket import *
    server_ip ='127.0.0.1'
    file_name='1.jpg'
    #封装读请求
    send_data=struct.pack('!H%dsb5sb'%len(file_name),1,file_name.encode(),0,'octet'.encode(),0)
    #建立套接字
    udp_socket=socket(AF_INET,SOCK_DGRAM)
    udp_socket.sendto(send_data,(server_ip,69))
    #本地创建文件
    file=open(file_name,'ab')
    while True:
    reve_date=udp_socket.recvfrom(1024)
    #获取操作码和数据块编号
    zaozuoma,datas=struct.unpack('!HH',reve_date[0][:4])
    if zaozuoma == 5:
    print('文本不存在!')
    break
    file.write(reve_date[0][4:])
    if len(reve_date[0])<516:#表示读完
    break
    #发送确认包
    ack_data=struct.pack('!HH',4,datas)
    udp_socket.sendto(ack_data,(server_ip,reve_date[1][1]))


    4.TCP是安全可靠的,是因为要建立3次握手,及双方都需要确认信息后,才能进行通讯。

    编码1:
    '''
    tcp服务端编程
    '''
    from socket import *
    #创建服务器套接字对象
    socket_tcp=socket(AF_INET,SOCK_STREAM)
    #绑定端口
    socket_tcp.bind(('',9999))
    #进行监听
    socket_tcp.listen()
    #接收客户端连接
    client_socket,client_info=socket_tcp.accept()
    #接收客户端发送的信息
    reve_data=client_socket.recv(1024)
    print('接收到来自%s的信息%s'%(client_info,reve_data.decode('gb2312')))
    #关闭连接
    client_socket.close()
    socket_tcp.close()
    '''
    模拟客户端qq通讯
    '''
    from socket import *
    #创建客户端socket
    client_socket=socket(AF_INET,SOCK_STREAM)
    #调用connect方法与服务器建立连接
    client_socket.connect(('192.168.0.101',8899))
    while True:
    msg=input('客户端:')
    client_socket.send(msg.encode('utf-8'))
    if msg == 'bye':
    break
    client_date=client_socket.recv(1024)
    print('服务器:',client_date.decode('utf-8'))
    client_socket.close()

    编码2:模拟qq进行多人通讯
    '''
    服务器端TCP
    '''
    from socket import *
    from threading import Thread
    sockets = []
    def main():

    # 创建服务器端socket
    server_tcp = socket(AF_INET, SOCK_STREAM)
    # 绑定地址
    server_tcp.bind(('', 8999))
    # 开启监听
    server_tcp.listen()

    while True:
    client_tcp, client_info = server_tcp.accept()
    sockets.append(client_tcp)
    t1 = Thread(target=readToSend, args=(client_tcp,))
    t1.start()


    def readToSend(client_tcp):
    while True:
    client_data = client_tcp.recv(1024)
    if client_data.decode('utf-8').endswith('bye'):
    sockets.remove(client_tcp)
    client_tcp.close()
    break
    if len(client_data)>0 :
    for Onesocket in sockets:
    if Onesocket != client_tcp:
    Onesocket.send(client_data)


    if __name__ == '__main__':
    main()

    '''
    多线程客户端
    '''
    from socket import *
    from threading import Thread
    #创建客户端套接字
    client_tcp=socket(AF_INET,SOCK_STREAM)
    #创建连接对象
    client_tcp.connect(('192.168.0.101',8999))
    user_name=input("请输入用户名:")
    flag=True
    def writeInfo(client_tcp):
    global flag
    while flag:
    mags=input('>')
    mags=user_name+'说:'+mags
    client_tcp.send(mags.encode('utf-8'))
    if mags.endswith('bye'):
    flag=False
    def readInfo(client_tcp):
    while flag:
    client_data=client_tcp.recv(1024)
    print('收到:',client_data.decode('utf-8'))
    #创建读写线程
    t1=Thread(target=readInfo,args=(client_tcp,))
    t1.start()
    t2=Thread(target=writeInfo,args=(client_tcp,))
    t2.start()
    t1.join()
    t2.join()
    client_tcp.close()
     
  • 相关阅读:
    mysql 刘道成视频教程 第4-8课 --- 数据类型
    mysql 刘道成视频教程 第3课
    9款优秀的开源版本控制和源代码管理系统 转载
    mysql主要应用场景 转载
    平时收藏网页
    mysql 刘道成视频教程1、2课----------大致结构
    软件
    visual studio 2010 快捷键
    将CString(unicode)转换为char*(ANSI)
    去掉Visual Studio 编辑器里中文注释的红色波浪线 转载
  • 原文地址:https://www.cnblogs.com/dangjingwei/p/12371044.html
Copyright © 2011-2022 走看看