01.Python修炼之路【03-Socket套接字】(2018.04.20)

1.本地的进程间通信(IPC)有很多种方式,例如

  • 队列
  • 同步(互斥锁、条件变量等)

以上通信方式都是在一台机器上不同进程之间的通信方式,那么问题来了

网络中进程之间如何通信?

2. 网络中进程之间如何通信

首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!

本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。

其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议(UDP/TCP)+端口”可以唯一标识主机中的应用程序(进程

这样利用ip地址,协议,端口就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。

3. 什么是socket(全双工)

socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:

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

例如我们每天浏览网页、QQ 聊天、收发 email 等等

4. 创建socket

在 Python 中 使用socket 模块的函数 socket 就可以完成:

socket.socket(AddressFamily, Type)

说明:

函数 socket.socket 创建一个 socket,返回该 socket 的描述符,该函数带有两个参数:

  • Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET
  • Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)
  • 注:TCP/UDP协议属于传输层的协议。TCP:传输速度慢、稳定;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'

实例:向IP:192.168.165.115发送消息

from  socket  import  *

udpSocket  =  socket(socket.AF_INET,  socket.SOCK_DGRAM)

udpSocket.sendto(b"HELLO WORLD!",("192.168.165.115",8080)) # b等价于encode("utf-8")    在Python3中独有.


接收上面IP发送的消息:

import socket import *

udpSocket = socket(AF_INET, socket_DGRAM)

udpSocket.bind("",7788)   # IP地址和绑定端口号,便于对进程发送数据,IP一般不用写,表示本机的任何一个ip

recvData = udpSocket.recvfrom(1024)   # 1024在此处是指本次接收的最大字节数

content, destInfo = recvData  #对recvData接收到的数据进行解码操作;

print("content is:%s"%content.decode("utf-8"))  # 显示接收到的数据,解码格式为utf-8

udpSocket.close()  # 关闭套接字


--------------------------------------------什么叫本机IP----------------------------------------------------------------

注:

localhost 就是一个域名,域名指向 127.0.0.1 ,两者是一样的。

至于本机 IP,你可以理解为本机有三块网卡,一块网卡叫做 loopback(这是一块虚拟网卡),另外一块网卡叫做 ethernet (这是你的有线网卡),另外一块网卡叫做 wlan(这是你的无线网卡)。

你的本机 IP 是你真实网卡的 IP,具体来说有线无线各有一个,而 127.0.0.1 是那块叫做 loopback 的虚拟网卡的 IP。


-----------------------------------------------------------全双工、半双工、单工----------------------------------------

1. 单工:指两者的通信是单向的,一个只能主动的发信号,而另一个只能被动的接受信息

eg:像交通灯可以发起各种信号,而行人、车辆只能被动接受信息。

2. 半双工:两个对象A和B,A能发信息给B,B也能发消息给A,但这两个动作不可以同时进行

eg:对讲机,A可以把消息发送给B,但此时B不能把消息发送给A,等A说完以后,B才可以说话。

3. 全双工:两个对象A和B,A能发信息给B,B也能发消息给A,并且这两个动过可以同时进行。

eg:打电话的两个人。


-----------------------------------------编码格式问题-----------------------------------------

from  socket  import * 

udpSocket = socket(AF_INET, socket_DGRAM)  #创建一个Udp套接字

destIp = input("please  input  IP:")  # 输入对方用户IP

destPort = int(input("please  input  port?:"))  # 输入对方用户端口号

sendData= input("please  input   senddata:")  #输入要发送的数据信息


udpScoket.sendto(sendData.encode("utf-8"),(destIp,destPort)) #向对方发送信息,编码格式为utf-8;将IP和端口用元组进行表示




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值