Python 基础之socket编程(一)

    Python 基础之socket编程(一) 

    可以进行通信玩儿了,感觉不错不错,网络通信就像打电话,我说一句你听一句之后,你再说一句,我听一句,就这样。。。。。下去了。不扯淡了,来来来,看看今天都搞了点啥东西。

    一、 客户端与服务器架构     

        即C/S架构,包括

        1.硬件C/S架构(打印机)

        2.软件C/S架构(web服务)

    二、Socket 是何鬼?

        简单来说Socket就是用来完成客户端与服务器之间的通信

        例如浏览器访问网页,例如网络游戏等一切基于客户端服务器来实现的C/S架构程序

       Socket是基于互联网OSI七层协议的一个结构,准确的说是基于建议互联网模型OSI五层协议的接口

        

       此处延伸一个概念:套接字

       套接字在最开始的时候,是应用于进程与进程之间的通信,之后被广泛应用到互联网,基本上分为两个种族

       基于文件类型的套接字:AF_UNIX

       基于网络类型的套接字:AF_INET

      而对于我们来说重点肯定是网络类型,so今后我们会对AF_INET分解研究

      套接字的工作流程:

    

     接下来说一下socket通信时用的一些方法:

这里我们可以看出来socket的基本工作流程了,也大致看了一下socket通信时所用到的方法

服务端套接字函数

服务端套接字函数
s.bind()    绑定(主机,端口号)到套接字
s.listen()  开始TCP监听
s.accept()  被动接受TCP客户的连接,(阻塞式)等待连接的到来

客户端套接字函数
s.connect()     主动初始化TCP服务器连接
s.connect_ex()  connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

公共用途的套接字函数
s.recv()            接收TCP数据
s.send()            发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall()         发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom()        接收UDP数据
s.sendto()          发送UDP数据
s.getpeername()     连接到当前套接字的远端的地址
s.getsockname()     当前套接字的地址
s.getsockopt()      返回指定套接字的参数
s.setsockopt()      设置指定套接字的参数
s.close()           关闭套接字

面向锁的套接字方法
s.setblocking()     设置套接字的阻塞与非阻塞模式
s.settimeout()      设置阻塞套接字操作的超时时间
s.gettimeout()      得到阻塞套接字操作的超时时间

面向文件的套接字的函数
s.fileno()          套接字的文件描述符
s.makefile()        创建一个与该套接字相关的文件

到底socket是如何进行通信的呢?来来来,看两个例子先:

1.简单版的c/s通信

import  socket

phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 买手机

phone.connect(('127.0.0.1',8080)) # 拨通电话

phone.send('hello'.encode('utf-8'))  # 发消息

data=phone.recv(1024)
print('收到服务端的发来的消息:',data)
socket 客户端
import socket

phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # 买手机 #  socket.SOCK_STREAM 代表tcp协议 (此句的含义是网络通信基于tcp协议)
phone.bind(('127.0.0.1',8080)) #写成元组的形式 #绑定手机卡

phone.listen(5) # 5 代表可以有5个电话在这里等着  #开机操作

print('_____====>')

conn,addr = phone.accept() #等待电话 (conn :电话链接;addr:对方的手机号码)

msg = conn.recv(1024)  #收消息
print('客户端发来的消息是',msg) # 打印收到的消息
conn.send(msg.upper())  # 发送消息

conn.close() # 关闭电话链接
phone.close() # 关手机
socket服务端

2.完善版的c/s通信

from socket import *

ip_port=('127.0.0.1',8080)
back_log=5
buffer_size=1024

tcp_client=socket(AF_INET,SOCK_STREAM)
tcp_client.connect(ip_port)


while True:
    msg=input('>>: ').strip()
    # if not msg:continue
    # if msg == 'q':
    #     break
    tcp_client.send(msg.encode('utf-8'))
    print('客户端已经发送消息')
    data=tcp_client.recv(buffer_size)
    print('收到服务端发来的消息',data.decode('utf-8'))

tcp_client.close()
socket客户端
from socket import *

ip_port=('127.0.0.1',8080)
back_log=5
buffer_size=1024

tcp_server=socket(AF_INET,SOCK_STREAM)
tcp_server.bind(ip_port)
tcp_server.listen(back_log)

print('服务端开始运行了')
conn,addr=tcp_server.accept() #服务端阻塞
print('双向链接是',conn)
print('客户端地址',addr)

while True:
    data=conn.recv(buffer_size)

    print('客户端发来的消息是',data.decode('utf-8'))

    conn.send(data.upper())


conn.close()

tcp_server.close()
socket服务端
posted @ 2017-05-09 16:46  还是牛  阅读(186)  评论(0编辑  收藏  举报