Socket网络编程初探
http://altboy.blog.51cto.com/5440160/1921720
客户端/服务器架构
- 即C/S架构,其实web服务在某种意义上也算是C/S架构 
- 一个特点是服务器端持续运行对外提供服务 
为何学习socket一定要先学习互联网协议:
- C/S架构的软件是基于网络进行通信的 
- 网络的核心就是一堆协议,即标准,想要开发一款基于网络通信的软件就必须遵循这些标准 
- socket是处在应用层和传输层中间的一组接口 

说到这,那么socket到底是个什么呢?Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在socket接口后面,对用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议。所以,无需深究TCP/UDP协议,socket已经为我们封装好了
基于文件类型的套接字家族:AFUNIX基于网络类型的套接字家族:AFINET
套接字的工作流程

先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束
服务端套接字函数
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()        创建一个与该套接字相关的文件代码示例:
服务端
from socket import *
phone=socket(AF_INET,SOCK_STREAM)
phone.bind(('127.0.0.1',8081))
phone.listen(5)
conn,addr=phone.accept()
while True:
    data=conn.recv(1024)
    print('server===>')
    print(data)
    conn.send(data.upper())
conn.close()
phone.close()客户端
from socket import *
phone=socket(AF_INET,SOCK_STREAM)
phone.connect(('127.0.0.1',8081))
while True:
    msg=input('>>: ').strip()
    phone.send(msg.encode('utf-8'))
    print('client====>')
    data=phone.recv(1024)
    print(data)注意:这时候当客户端输入消息为空的话程序会卡住,那是因为无论是服务端还是客户端都要到自己所在主机缓冲区去拿消息,因为这时发送为空,服务端根本就不会有任何反应,所以客户端的缓冲区也不会有任何内容,所以这时它会一直徒劳的等待。。。
这时的解决办法当然要在客户端想办法,很简单,我们不让客户端发送空消息即可,在send()方法之前加判断:
if not msg :continue你肯定以为这个时候就完事了,这时请尝试断开客户端链接试试。。。试想,既然作为服务端,顾名思义就是要持续不断的为不同的客户端持续的提供服务,怎么能一个客户端用完即结束呢?解决方案如下:
while True: #链接循环
    conn,addr=phone.accept() 
    print('电话线路是',conn)
    print('客户端的手机号是',addr)
    while True: #通信循环
        try:
            data=conn.recv(1024)
            if not data:break
            print('客户端发来的消息是',data)
            conn.send(data.upper())
        except Exception:
            break
    conn.close()
phone.close()注意:可能会有人遇到重启服务端时Address already in use 的情况,这个是由于你的服务端仍然存在四次挥手的timewait状态在占用地址(如果不懂,请深入研究1.tcp三次握手,四次挥手 2.syn洪水攻击 3.服务器高并发情况下会有大量的timewait状态的优化方法)
解决方法:
#加入一条socket配置,重用ip和端口
phone=socket(AF_INET,SOCK_STREAM)
phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
phone.bind(('127.0.0.1',8080))Socket网络编程初探的更多相关文章
- SOCKET网络编程5
		SOCKET网络编程快速上手(二)——细节问题(5)(完结篇) 6.Connect的使用方式 前面提到,connect发生EINTR错误时,是不能重新启动的.那怎么办呢,是关闭套接字还是直接退出进程呢 ... 
- Linux Socket 网络编程
		Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ... 
- Python Socket 网络编程
		Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ... 
- Python全栈【Socket网络编程】
		Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ... 
- python之Socket网络编程
		什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ... 
- Python之路【第七篇】python基础 之socket网络编程
		本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket 网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ... 
- Socket网络编程-基础篇
		Socket网络编程 网络通讯三要素: IP地址[主机名] 网络中设备的标识 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址 有效端口:0~65535 其 ... 
- Socket网络编程--FTP客户端
		Socket网络编程--FTP客户端(1)(Windows) 已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解F ... 
- windows下的socket网络编程
		windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ... 
随机推荐
- react之入门
			react出于FackBook,是一个将js与css共写的里程碑,主要用于构建UI,很多人认为 React 是 MVC 中的 V(视图),后来出现redux更多的是处理数据,所以也适合做逻辑复杂的管理 ... 
- uCareSystem:Ubuntu/Linux Mint的一体化系统更新和维护工具
			对于任何一款允许用户还原电脑到之前状态(包括文件系统,安装的应用,以及系统设置)的操作系统来说,系统还原功能都是必备功能,它可以恢复系统故障以及其他的问题. 有的时候安装一个程序或者驱动可能让你的系统 ... 
- python+selenium高亮显示正在操作的页面元素
			原文地址:https://blog.csdn.net/wxstar8/article/details/80801405 from selenium import webdriver import un ... 
- UI:地图和定位
			参考学习链接 各种IOS设备可以使用 Core Location 框架确定它的物理位置.core location 主要使用三种技术来实现功能.GPS.蜂窝基站三角网络定位. wifi 定位服务.这三 ... 
- CSS中style用法详解
			转自:http://www.cnblogs.com/xingxingchongchong/p/6501575.html css样式表按其所在位置分三种: 1.内嵌样式表 2.内部样式表 3.外部样式表 ... 
- Table View Programming Guide for iOS---(一)---About Table Views in iOS Apps
			About Table Views in iOS Apps Table views are versatile user interface objects frequently found in i ... 
- LXD安装
			#安装 #初始化(一路next) sudo lxd init #启动容器 lxc launch ubuntu:16.04 first #进到容器内 lxc exec first -- /bin/bas ... 
- The IBM Blockchain Platform:Installing the development environment
			Follow these instructions to obtain the IBM Blockchain Platform: Develop development tools (primaril ... 
- POJ3264【线段树】
			求区间最值-(基础,继续) code---.. #include<cstdio> #include<iostream> #include<string.h> #in ... 
- 1.基础数据类型的初识 字符串 bool 整型 if else elif
			---恢复内容开始--- 计算器基础知识 cpu :人类的大脑 运算和处理问题 内存:临时存储数据 断点就消失了 高铁 硬盘:永久存储数据 图片 操作系统:是一个软件 控制每个硬件之间的数据交互 Py ... 
