理解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. WCF系列教程之WCF服务配置

    文本参考自:http://www.cnblogs.com/wangweimutou/p/4365260.html 简介:WCF作为分布式开发的基础框架,在定义服务以及消费服务的客户端时可以通过配置文件 ...

  2. FocusBI:地产分析&雪花模型

    微信公众号:FocusBI关注可了解更多的商业智能.数据仓库.数据库开发.爬虫知识及沪深股市数据推送.问题或建议,请关注公众号发送消息留言;如果你觉得FocusBI对你有帮助,欢迎转发朋友圈或在文章末 ...

  3. 令狐冲和TCP/IP协议的第三层协议的关系(经典)

    今天突然想起来去看了看我以前在csdn的博客,发现一篇以前一直被奉为经典的文章,哈哈,再转过来和大家看看:              令狐冲十四岁那年进入华山,那年岳琳珊八岁,岳不群白天给两人指点剑法 ...

  4. 6.042 Mathematics for Computer Science

    课程信息 6.042 Mathematics for Computer Science

  5. JAVA泛型——基本使用

    Java1.5版本推出了泛型,虽然这层语法糖给开发人员带来了代码复用性方面的提升,但是这不过是编译器所做的一层语法糖,在真正生成的字节码中,这类信息却被擦除了.笔者发现很多几年开发经验的程序员,依然不 ...

  6. i.mx android6 输入子系统分析(未完)

    参考:http://blog.csdn.net/u010312937/article/details/53285286 https://www.jianshu.com/p/7fca94b330ea   ...

  7. Restful的优势

    1. 轻量,直接基于http,不在需要任何别的诸如消息协议.get/post/put/delete为CRUD操作2. 面向资源,一目了然,具有自解释性.3. 数据描述简单,一般以xml,json做数据 ...

  8. [编程] C语言的结构体

    结构体 struct 结构体名{} 变量名; 结构体变量: struct person{ char *name; int age; float score; } student; 成员的获取和赋值 / ...

  9. Java基础教程(2)--Java开发环境

    一.JVM.JRE和JDK的概念   对于初学者来说,这三个术语出现的频率很高,而且有关这它们的问题在面试题中也会经常出现.因此,理解它们的定义.区别和联系就显得尤为重要.在学习这几个专业术语之前,我 ...

  10. 三:SQL server基础

    /一:创建数据库/ use master if exists (select * from sysdatabases where name='数据库名称') drop database 数据库名称 - ...