理解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. linux通过源码安装nodejs

    1.下载nodejs源码,下载地址:https://nodejs.org/en/download/ 2.下载回来后,解压缩,ubuntu系统ctrl + alt +T 打开终端 假如tar.gz压缩包 ...

  2. pycharm使用github

    pycharm使用github 绑定账号 File-settings 在搜索框输入git 会出现github,然后在旁边输入你github的用户名和密码,可以点击”test”测试一下,如果出现: Co ...

  3. python笔记03-----文件操作

    文件操作 创建一个文件名字为filename 内容是 BJSHGDTW 打印文件编码 f = open("filename",'r',encoding="utf-8&qu ...

  4. PHP之string之addcslashes()函数使用

    addcslashes (PHP 4, PHP 5, PHP 7) addcslashes - Quote string with slashes in a C style addcslashes - ...

  5. PHP之mb_substr使用

    mb_substr (PHP 4 >= 4.0.6, PHP 5, PHP 7) mb_substr - Get part of string mb_substr - 获取部分字符串 Descr ...

  6. 弗格森&红魔

    本周日曼联对阵斯旺西时,一位名叫皮特-莫利纽克斯的58岁老人,将会举起一张老旧的床单,就如他曾做过的那样.那一次“臭名昭着”的行为要追溯到1989年12月,弗格森当时已经来到了悬崖边上,他的背后是一堵 ...

  7. 去掉img标签周围的空白

    我们在页面布局的时候,明明已经去掉了所有标签的margin和padding,img标签周围依然会有空白,解决方法有以下几种: 1.给img标签设浮动: img{ float:left; } 2.将im ...

  8. [PY3]——IO——pathlib

    pathlib.Path() from pathlib import Path p=Path("/test2") Path.cwd() print(p.cwd()) /py3 Pa ...

  9. Linux安装AUTOCONF和AUTOMAKE产生的程序的一般步骤

    概述: 在Linux下安装一个应用程序时, 一般先运行脚本configure, 然后用make来编译源程序, 在运行make install, 最后运行make clean删除一些临时文件. 相关点的 ...

  10. [转]flash.net.Socket

    本文转自:http://designstacks.net/actionscript-3-new-capabilities http://help.adobe.com/en_US/ActionScrip ...