码迷,mamicode.com
首页 > 其他好文 > 详细

网络编程

时间:2017-09-15 21:35:44      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:通信   标识   其他   sendto   应用   div   选项   create   输出   

网络简单小介绍
 
     网络就是一种辅助双方或者多方的设备能够连接在一起的工具 比如:电脑,智能手机,ipad。它的目的就是来实现不同设备之间运行软件(进程)之间的数据的共享,即进程之间的通信
 
ip地址:用来在网络中标记一台电脑,比如192.168.1.1;在本地局域网上是唯一的。
 
ip又分为ipv4 和 ipv6, 192.168.101.81 81的取值范围是0-255但是0和255不能用
 
ip地址的作用:找到对方的设备的ip地址给对方的设备发送数据
 
端口:端口就是数据传入和传出的入口
 
端口号:系统会自动分配一个唯一的号码,来标识一个端口。范围是0-65535,但是系统使用的端口号0-1023, 我们自己设置的端口要从1024以后使用。
 
端口分类:分为知名端口和动态端口, 知名端口表示端口号固定,取值范围0-1023, 动态端口: 系统会自动分配一个端口号,保证端口号唯一,它的取值范围从1024-65535。(友情提示:自己在设置端口号的时候不能重复,不要设置1024以下的)
 
端口号的作用:把数据给指定的进程
 
网络通信的过程: 先通过ip地址找到对应的设备(电脑、智能手机,ipad), 然后通过端口号找到对应的进程(运行起来的程序),就可以收发数据了
 
socket 简介
 
     socket简称 套接字,它就是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:

它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的

例如我们每天浏览网页、QQ 聊天、收发 email 等等
 
在python中使用socket模块的函数socket就可以完成创建socket
 
创建客户端socket小案例:
     
# 创建客户端udp的socket,完成发送数据
import socket

# 判断该模块是否是程序的入口
if __name__ == __main__:
    # 1. 创建socket
    # 第一个参数是地址类型, 这个地方使用ipv4
    # 第二个参数是传输层协议, udp
    udp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 绑定本地信息,也就是本地程序的端口
    # "": 表示本地的任意ip地址都可以,防止一台电脑上有多个网卡
    udp_client_socket.bind(("", 8865))
    # 发送的内容
    send_content = "您好,我是客户端小白。"
    # 2. 发送消息
    # 提示: 如果在乌班图系统下使用utf-8,如果在windows系统下使用gbk
    udp_client_socket.sendto(send_content.encode("utf-8"), ("192.168.101.81", 4343))
    # 接收服务端socket发送的数据
    # 1024:表示每次接收数据字节大小
    # 提示: recvfrom这个接收数据的这个函数会如果服务端没有给我们客户端发送数据,那么会一直阻塞
    # 提示: 只有服务端的socket给客户端的socket发送数据以后,
    # 客户端接收到以后才解阻塞,程序会继续往下执行
    recv_data, ip_port = udp_client_socket.recvfrom(1024)
    # 解码操作
    recv_content = recv_data.decode("utf-8")
    print("接收到的数据: %s ip地址: %s" % (recv_content, ip_port))
    # 3. 关闭socket
    udp_client_socket.close()

 

创建一个udp客户端程序的流程是简单,具体步骤如下:

  1. 创建客户端套接字
  2. 发送/接收数据
  3. 关闭套接字

 

飞鸽传书小应用

下面这段代码主要用于定义常量

fq_verson = 1 
fq_username = firstname
hostname = localhost
# 接收方
recv_ip = 192.168.101.200
# 固定端口
port = 2425
# 上线指令
IPMSG_BR_ENTRY = 0x00000001
# 下线指令
IPMSG_BR_EXIT = 0x00000002
# 发送内容
IPMSG_SENDMSG = 0x00000020
# 客户端socket默认为None
client_socket = None

recv_info = {}

 

下面这段代码主要用于设置发送指令并给飞秋发送消息

import config
import time

def send_fq(content):
    ‘‘‘发送给飞秋‘‘‘
    config.client_socket.sendto(content.encode(gbk), (config.recv_ip, config.port))

def set_format(send_instruct,content):
    ‘‘‘设置发送指令‘‘‘
    send_content = %d:%d:%s:%s:%s:%s % (config.fq_verson, int(time.time()), config.fq_username,
                                          config.hostname, send_instruct, content)
    send_fq(send_content)


def onclient():
    ‘‘‘上线提醒‘‘‘
    set_format(config.IPMSG_BR_ENTRY,config.fq_username)

def offclient():
    ‘‘‘下线提醒‘‘‘
    set_format(config.IPMSG_BR_EXIT,config.fq_username)

def set_content():
    ‘‘‘发送消息‘‘‘
    user_int = input(请输入您要发送的内容:)
    set_format(config.IPMSG_SENDMSG,user_int)

 

接收飞秋返回来的消息,用字符串分割并保存输出

import config
def recv_word():
    ‘‘‘接收消息‘‘‘
    while 1:
        recv_content,ip_prot = config.client_socket.recvfrom(1024)
        end_content = recv_content.decode(gbk)
        recv_list = end_content.split(:,5)
        config.recv_info[version] = recv_list[0]
        config.recv_info[number] = recv_list[1]
        config.recv_info[username] = recv_list[2]
        config.recv_info[hostname] = recv_list[3]
        config.recv_info[send_format] = recv_list[4]
        config.recv_info[conten] = recv_list[5]
        print(config.recv_info[conten])

 

创建socket 并启动应用程序

import socket
import send_socket
import recv_socket
import config
import threading

def create_socket():
    # global client_socket
    # 创建socket对象
    config.client_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    # 建立广播
    config.client_socket.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,True)
    # 绑定端口
    config.client_socket.bind((‘‘,5555))
print(config.client_socket)
def user_select():
    print(======飞鸽传书V1.0======)
    print(1:上线提醒)
    print(2:下线提醒)
    print(3:发送消息)
    print(4:接受消息)
    print(0:退出)
    return input(请输入您要进行的操作选项:)

if __name__ == __main__:
    create_socket()
    print(config.client_socket)

    recv_socket_thread = threading.Thread(target=recv_socket.recv_word)
    recv_socket_thread.start()
    while True:
        ret = user_select()
        if ret == 1:
            send_socket.onclient()
        elif ret == 2:
            # 下线
            send_socket.offclient()
        elif ret == 3:
            # 发送消息
            send_socket.set_content()
        elif ret == 4:
            # 接受消息
            recv_socket.recv_word()
        elif ret == 0:
            # 退出
            break
        else:
            print(输入错误,请重新输入)

    config.client_socket.close()

 

网络编程

标签:通信   标识   其他   sendto   应用   div   选项   create   输出   

原文地址:http://www.cnblogs.com/zhangguodong/p/7528429.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!