理解socket

soxket因为TCP是面向流的,你发的信息如果很多很快,TCP这样就会形成黏包

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

其实站在你的角度上看,socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。
也有人将socket说成ip+port,因为ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序。
所以我们只要确立了ip和port就能找到一个应用程序,并且使用socket模块来与之通信。

socket层

套接字(socket)初使用

基于TCP协议的socket

tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端

server端

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字 这个ip地址和端口是输入你想进行连接的地址和端口
sk.listen() #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024) #接收客户端信息
print(ret) #打印客户端信息
conn.send(b'hi') #向客户端发送信息
conn.close() #关闭客户端套接字
sk.close() #关闭服务器套接字(可选)
import socket
sk = socket.socket() # 买手机
sk.bind(('127.0.0.1', 9000)) # 插卡
sk.listen() # 等待连接
conn,addr = sk.accept() # 等着接conn 电话 后面是ip和端口
print(addr) # 把IP和端口打印出来
# conn.send('您好'.encode('UTF-8'))
ret = conn.recv(1024) # 这个是接受你传递进来信息 1024是1024个字节一般不会超过这个字节
conn.send('您好'.encode('UTF-8')) # 你回发的消息
print(ret.decode('UTF-8')) #把你接受的信息 给解码
conn.close() # 关闭信息
sk.close() # 关机
 

因为tcp是全双工的通信可以先发送再接受消息的 所以  recv和send可以颠倒顺序

client端

import socket
sk = socket.socket() # 创建客户套接字
sk.connect(('127.0.0.1',8898)) # 尝试连接服务器
sk.send(b'hello!')
ret = sk.recv(1024) # 对话(发送/接收)
print(ret.decode('UTF-8'))
sk.close() # 关闭客户套接字

上面只是一个小小的就是只发一次的通信 我们下面做一个可以一直通信并且可以询问什么时候结束的:

升级版版本

server端:

import socket
sk = socket.socket()
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 这个是你的端口和别的相连接的时候还继续可以进行连接
sk.bind(('127.0.0.1', 9010))
sk.listen()
while True:
conn,addr = sk.accept() # 这个必须放在外面 不然你放在里面别人给你打电话的时候不至于一直还要重新接受端口不合理 while True:
# conn, addr = sk.accept()
ret = conn.recv(1024).decode('UTF-8')
print(ret)
if ret == 'q':break
inp = input('>>>>').strip()
conn.send(inp.encode('UTF-8'))
if inp == 'q':break
conn.close()
sk.close()

client端口:

import socket
sk = socket.socket()
sk.connect(('127.0.0.1', 9010))
while True:
inp = input('>>>').strip()
sk.send(inp.encode('UTF-8'))
if inp == 'q':break
ret = sk.recv(1024).decode('UTF-8')
print(ret)
if ret == 'q':break
sk.close()

tcp协议适用于 文件的上传和下载 发送邮件 发送重要的文件
每和一个客户端建立链接 都会在自己的操作系统上占用一个资源
同一时间 只能 和一个客户端通信

基于UDP协议的socket(套接字)

tcp是只能依次只能连接一个因为它需要找到端口来连接  一个端口只能对应一个程序 所以tcp的服务端只能和一个请求者相连接

而UDP协议是不需要端口的  所以我们不需要进行端口的连接 直接可以相连接

sever端口:

import socket
lst = {'egon':'\033[1;31m', 'eva':'\033[1;34m'} # 把你的信息存放在一个字典中 然后你马上输入的信息人名字会从中合格字典中提取
sk = socket.socket(type =socket.SOCK_DGRAM)
sk.bind(('127.0.0.1', 9090))
while True:
msg,client_addr = sk.recvfrom(1024)
name,messg = msg.decode('UTF-8').split(':') # 因为你设置的发送端是把名字加冒号把内容给传递进来的 所以我们以冒号为分割点
color = lst.get(name.strip(),'')
print('{} {}'.format(color,msg.decode('UTF-8')))
inp = input('>>>').strip()
sk.sendto(inp.encode('UTF-8'),client_addr)
sk.close()

client端口:

import socket
sk = socket.socket(type = socket.SOCK_DGRAM)
name = input('>>>>').strip() while True:
inp = input('>>>').strip()
sk.sendto("{}:{}".format(name,inp).encode('UTF-8'), ('127.0.0.1', 9090))
msg,addr = sk.recvfrom(1024)
print(msg.decode('UTF-8'))
sk.close()

UDP的升级版本:

server端口:

from mysocket import Mysocket
sk = Mysocket()
sk.bind(('127.0.0.4', 9090))
while True:
msg,client_addr = sk.my_recv(1024)
print(msg)
if msg == 'q':sk.close()
inp = input('>>').strip()
sk.my_send(inp,client_addr)
if inp == 'q':sk.close()
sk.close() 你需要导入的模块mysocket
from socket import *
class Mysocket(socket): # 继承socket这个模块
def __init__(self, coding = 'UTF-8'):
self.coding = coding # 把utf-8赋值给对象的属性
super().__init__(type = SOCK_DGRAM) # 调用父类中 type
def my_recv(self, num):
msg, addr = self.recvfrom(num)
return msg.decode(self.coding),addr # 把输入者和端口返回出去
def my_send(self, msg, addr):
return self.sendto(msg.encode(self.coding),addr) clinet端口:
from mysocket import Mysocket
sk = Mysocket()
while True:
inp = input('>>').strip()
sk.my_send(inp,('127.0.0.4', 9090))
msg,addr = sk.my_recv(1024)
print(msg)
sk.close()

udp升级版本

socket概念 套接字的更多相关文章

  1. python 全栈开发,Day33(tcp协议和udp协议,互联网协议与osi模型,socket概念,套接字(socket)初使用)

    先来回顾一下昨天的内容 网络编程开发架构 B/S C/S架构网卡 mac地址网段 ip地址 : 表示了一台电脑在网络中的位置 子网掩码 : ip和子网掩码按位与得到网段 网关ip : 内置在路由器中的 ...

  2. iOS - Socket 网络套接字

    1.Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个 Socket.Socket 又称 "套接字",应用程序通常通过 "套接字& ...

  3. Socket称"套接字"

    Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 二.利用Socket建立网络连接的步骤 建立Socket连接至少需要一对 ...

  4. Win2 Socket(套接字)相关 API

    Socket(套接字) 作者信息 肖进 单位:南京中萃食品有限公司 资讯部 邮箱:xiaoj@njb.swirebev.com 电话:025-58642091 与socket有关的一些函数介绍 1.读 ...

  5. sanic官方文档解析之Custom Protocols(自定义协议)和Socket(网络套接字)

    1,Custom Protocol:自定义协议 温馨提示:自定义协议是一个高级用法,大多数的读者不需要用到此功能 通过特殊的自定义协议,你可以改变sanic的协议,自定义协议需要继承子类asyncio ...

  6. Linux Socket 原始套接字编程

    对于linux网络编程来说,可以简单的分为标准套接字编程和原始套接字编程,标准套接字主要就是应用层数据的传输,原始套接字则是可以获得不止是应用层的其他层不同协议的数据.与标准套接字相区别的主要是要开发 ...

  7. Linux系统C语言socket tcp套接字编程

    1.套接字的地址结构: typedef uint32_t in_addr_t; //32位无符号整数,用于表示网络地址 struct in_addr{ in_addr_t s_addr; //32位 ...

  8. Python之socket(套接字)

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

  9. Pyhont 网络编程【第一篇】初始Socket网络套接字

    一.什么是socket: Socket 别名 “网络套接字”,指网络通信链句柄 其实就是一堆网络信息(ip+端口) 建立起的链接称之为socket,Socket的英文原义是“孔”或“插座”,用来实现不 ...

随机推荐

  1. php 如何截取中文字符串

    在网站应用中时常需要对相应的字符串进行截取.最常用的是使用substr函数对字符串进行截取. 然而,substr和strlen函数只在处理英文字符串时可以正确使用,在截取中文字符时,时常出现乱码.这时 ...

  2. LINUX 查找替换命令 总结

    find /var/ -name "*.php" > /home/tmp 在/var/目录下查找 所有以.php后缀结尾的文件  结果很多,就 > 输出结果到/home ...

  3. rspec 笔记

    rspec的expect方法接收任何对象作为参数,并且返回一个rspec代理对象 叫做 ExpectationTarget. ExpectationTarget存储了传递给expect方法的对象,他响 ...

  4. 通过面试题,让我们来了解Collection

    前言 欢迎关注公众号:Coder编程 获取最新原创技术文章和相关免费学习资料,随时随地学习技术知识!** 本章主要介绍Collection集合相关知识,结合面试中会提到的相关问题进行知识点的梳理.希望 ...

  5. Go语言学习笔记四: 运算符

    Go语言学习笔记四: 运算符 这章知识好无聊呀,本来想跨过去,但没准有初学者要学,还是写写吧. 运算符种类 与你预期的一样,Go的特点就是啥都有,爱用哪个用哪个,所以市面上的运算符基本都有. 算术运算 ...

  6. lodop判断是否打印成功

    需要引用js <script src="js/jquery-3.3.1.js"></script> <script src="js/Lodo ...

  7. 十一、信号量控制Semaphore

    一.简介 有时候我们需要对一个资源的访问做线程数控制,以防雪崩等问题. JDK中,信号量可以处理这样的问题:Semaphore JDK文档:http://tool.oschina.net/upload ...

  8. 一、spark单机安装

    如果要全面的使用spark,你可能要安装如JDK,scala,hadoop等好些东西.可有时候我们只是为了简单地安装和测试来感受一下spark的使用,并不需要那么全面.对于这样的需要,我们其实只要安装 ...

  9. redis的默认配置文件redis.conf详解

    # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1k 5gb 4m 等酱紫: # # 1k => 1000 bytes # 1kb ...

  10. CentOS6.5下连网以及输入法下载

    宽带拨号连网: 1.系统--首选项--网络连接(或点击桌面右上角连网图标--VPN连接--VPN配置)       2.添加--选择DSL--勾自动连接(也可不勾)--DSL下填写用户名.密码--应用 ...