socket套接字/TCP

一 客户端/服务器架构

C/S架构,包括

  1. 硬件C/S架构(打印机)
  2. 软件C/S 架构(web服务)
  3. C/S架构的软件(软件属于应用层)是基于网络进行通信的

Server端要:

1.力求一直提供服务,

2.要绑定一个唯一的地址,让客户端能够明确的找到

osi七层

互联网的核心:基于一堆互联网协议组成

Tcp+ip 找到全世界独一无二的软件

互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层

每层运行常见物理设备

详细参考:

http://www.cnblogs.com/linhaifeng/articles/5937962.html#_label4

socket

socket是什么

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面。

五 套接字发展史及分类

基于文件类型的套接字家族

套接字家族的名字:AF_UNIX

unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信

基于网络类型的套接字家族

套接字家族的名字:AF_INET (地址家族,由于我们只关心网络编程,所以大部门我们只使用AF_INET)

六 套接字工作流程

服务器端:服务器端先初始化Socket,然后进行端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。

客户端:客户端初始化Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了,客户端发送数据请求,服务器接收请求并处理请求,然后把回应数据发送给客户端,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

Socket()模块函数用法

import socket
socket.socket(socket_family,socket_type,protocal=0)
socket_family(可以是AF_UNIX 或 AF_INET)
socket_type(可以是 SOCK_STREAM 或 SOCK_DGRAM)
protocal(一般不填,默认值为0) #获取tcp/ip套接字
tcpSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #获取udp/ip套接字
udpSock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

  

服务端套接字函数

s.bind()  绑定(主机,端口号)到套接字

s.listen()  开始TCP监听

s.accept()  被动接受TCP客户的连接,(阻塞式)等待连接的到来

客户端套接字函数

s.connect() 主动舒适化TCP服务器连接

s.connect_ex()  connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

公共用途的套接字函数

s.recv()  接收TCP数据

s.send()  发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)

s.close()  关闭套接字

socket通信流程与打电话流程类似:

#服务端
import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
phone.bind(("127.0.0.1",8000)) #绑定手机卡
phone.listen(5) #开机 print("starting.....")
conn,addr=phone.accept() #等待电话链接 print('电话线路是',conn)
print("客户端的手机号是",addr)
while True:#通信循环
data=conn.recv(1024) #收消息
print("客户端发来的消息是",data)
conn.send(data.upper()) conn.close() phone.close() 执行结果:
starting.....
电话线路是 <socket.socket fd=304, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 54668)>
客户端的手机号是 ('127.0.0.1', 54668)
客户端发来的消息是 b'bith' #客户端
import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(("127.0.0.1",8000)) while True:#通信循环
msg=input(">>: ").strip()
if not msg:continue
phone.send(msg.encode("utf-8"))
data=phone.recv(1024)
print(data) phone.close() 执行结果:
>>: bith
b'BITH'

修改版本

客户端终止,服务端程序不会中断

#服务端:
import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
phone.bind(("127.0.0.1",8000)) #绑定手机卡
phone.listen(5) #开机
print("starting.....")
while True: #链接循环
conn,addr=phone.accept() #等待电话链接
print('电话线路是',conn)
print("客户端的手机号是",addr)
while True:#通信循环
try: #应对Windows系统
data=conn.recv(1024) #收消息
print("客户端发来的消息是",data)
conn.send(data.upper())
except Exception:
break conn.close() phone.close() 执行结果
starting.....
电话线路是 <socket.socket fd=304, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 55009)>
客户端的手机号是 ('127.0.0.1', 55009)
客户端发来的消息是 b's'
电话线路是 <socket.socket fd=304, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8000), raddr=('127.0.0.1', 55010)>
客户端的手机号是 ('127.0.0.1', 55010) #客户端
import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(("127.0.0.1",8000)) while True:#通信循环
msg=input(">>: ").strip()
if not msg:continue
phone.send(msg.encode("utf-8"))
data=phone.recv(1024)
print(data) phone.close()

  

python--socket套接字/TCP的更多相关文章

  1. socket套接字TCP API

    socket套接字TCP API socket概念 socket又称"套接字",是计算机网络中进程间通信数据通道的一个端点.或称之为句柄.IP地址+port号就能够唯一确定一个so ...

  2. 02网络编程( socket套接字+TCP粘包 )

    目录 02 网络编程 一.socket套接字编程 二.简易代码模板 2.1 服务端 2.2 客户端 三.通信循环及代码优化 四.黏包现象 五.struct模块 六.简易版本报头 七.上传文件数据 * ...

  3. Python socket套接字通信

    一.什么是socket? socket是一个模块, 又称套接字,用来封装 互联网协议(应用层以下的层). 二.为什么要有socket? socket可以实现互联网协议 应用层以下的层 的工作,提高开发 ...

  4. socket套接字TCP协议传输-案例测试

    术语: 套接字接口:socket,是一个IP地址和一个端口号的组合,套接字可以唯一标识整个Internet中的一个网络进程. TCP连接:一对套接字接口(一个用于接收,一个用于发送)可定义面向连接的协 ...

  5. Python Socket套接字编程

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  6. python socket 套接字编程 单进程服务器 实现多客户端访问

    服务器: import socket #单进程服务器 实现多客户端访问 IO复用 #吧所有的客户端套接字 放在一个列表里面,一次又一次的便利过滤 server = socket.socket(sock ...

  7. Python Socket套接字

    socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Un ...

  8. Python socket套接字简单例子

  9. 传输模型, tcp socket套接字

    osi七层模型 tcp/ip四层模型 socket套接字 tcp 协议是可靠的  包括 三次握手 四次挥手 import socket # server server = socket.socket( ...

随机推荐

  1. 浅析JavaScript的prototype

    一.JavaScript对象的创建 (1)对象方法 function Student(name){ this.name=name; this.showName=function(){ alert(&q ...

  2. 初尝Eclipse

    一.选择开发工具 1.Eclipse和JDK 我所选用的是Eclipse开发工具,此工具可以用来编译JAVA语言,但windows系统没有内置的JAVA运行环境,所以需要下载JDK,用来配置JAVA的 ...

  3. svn版本提交冲突问题解决详解

    svn冲突文件解决方法   工具/原料   svn客户端 方法/步骤   1 通过SVN客户端更新需要的文件,如果出现有感叹号的文件,找到出现感叹号的文件. 2 选择感叹号文件,即冲突文件,单击鼠标右 ...

  4. SpringBoot工作机制

    1:前言 回顾探索Spring框架 1.spring ioc IoC其实有两种方式,一种就是DI,而另一种是DL,即Dependency Lookup(依赖查找),前者是当前软件实体被动接受其依赖的其 ...

  5. 用JAVA进行Json数据解析(对象数组的相互嵌套)

    这段时间我们在做一个英语翻译软件的小小小APP,涉及到了对Json数据的解析,所以特地来总结一下! 假设我们要对如下数据进行解析,其实在平时,返回的Json数据是很乱的,很难分清数据的关系,这是经过相 ...

  6. 常用的Oracle函数收集

    to_char(); count(); avg(); sum(); to_date('时间','格式'); NVL(,); NVL2(); substr(); case   when  then   ...

  7. linux性能调试之iostat

    iostat用来监控调试linux系统的IO性能. 一般用法: iostat -xdct time_interval count [disk] -x:显示扩展统计项,如果不使用-x参数只会打印基本统计 ...

  8. bootstrap 模态框(modal)插件使用

    今天用户登陆时,在原网页上弹出新登陆窗口,发现使用的是modal插件,记录下该插件的使用方法,手写强化下. 首先,模态框(modal)是覆盖在父窗体上的子窗体,目的是显示来自一个单独的源的内容,可以在 ...

  9. CSS3 box-shadow 属性

    定义和用法box-shadow 属性向框添加一个或多个阴影. 默认值: none继承性: no版本: CSS3JavaScript 语法: object.style.boxShadow="1 ...

  10. Struts2学习笔记四 OGNL

    OGNL,全称为Object-Graph Navigation Language(对象图表达语言),它是一个功能强大的表达式语言,用来获取和设置Java对象的属性,调用java对象的方法,同时能够自动 ...