文章目录

  • 一、套接字(socket)概述
  • 二、基于TCP协议的socket
    • socket初使用
    • 如果发送的是中文数据,则使用编解码
    • 简易聊天程序
  • 三、基于UDP协议的socket
    • 基于UDP协议的简易聊天程序
    • 改进,署名,输出带颜色
  • 读书正能量分享

一、套接字(socket)概述

套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

socket有很多种类型,但是咱们只需要知道两种就可以了

sk = socket.socket(family = AF_INET, type=SOCK_STREAM)

family :
1.AF_UNIX基于文件类型的套接字(早期socket是源自于unix系统而研发的一个功能,主要是为了同一台电脑上,多个程序直接通信) unix系统的中心思想是 : 一切皆文件
2.AF_INET基于网络类型的套接字

  type:一种是基于TCP协议   SOCK_STREAM一种是基于UDP协议   SOCK_DGRAMtcp 协议 : 可靠的,面向连接的,面向字节流形式的传输方式udp协议 : 不可靠的,不面向连接的,面向数据报的传输方式,但是它快

打开socket源码可以看到:

二、基于TCP协议的socket


所有的业务逻辑都在接收连接内进行,其他的都是一样的。

socket初使用

程序示例:
server_.py

import socket
import time
sk = socket.socket()# 不传参数,默认使用基于网络类型的套接字, 协议 : TCP
# 127.0.0.1
sk.bind(('127.0.0.1',8080))# 端口的范围是0-65535   但是 0-1023 这些是保留的,别用
sk.listen()# 监听,同时能接受的连接print(123)
conn,addr = sk.accept()# 等待接受客户端的连接  阻塞等待
print(456) # 客户端运行连接之后才执行
ret = conn.recv(1024)  #接收客户端信息
print(ret)       #打印客户端信息
conn.send(b'hi')        #向客户端发送信息
print('conn:',conn)
print('addr:',addr)time.sleep(20)conn.close()
sk.close()

client_.py

import socket
import time
sk = socket.socket()sk.connect(('127.0.0.1',8080))# 连接
sk.send(b'hello!')
ret = sk.recv(1024)         # 对话(发送/接收)
print(ret)
time.sleep(20)sk.close()

刚开始运行服务器端(server_.py):

由于客户端还没连接上服务器端, 所以会先等待接受客户端的连接 (阻塞等待)

运行客户端(client_.py):

发现已经连接上服务器端,并接收到服务器端发来的数据(b’hi’)

再打开server_.py的控制台:

可以看到客户端连接之后,456被打印出来,并且收到了客户端发来的数据(b’hello!’)

conn显示的是连接信息,里面的laddr是服务器端的ip地址和端口号,raddr是客户端的ip地址和客户端运行之后自己产生的端口号
addr:客户端的ip地址和端口号, ip地址 + 端口 能唯一找到某台电脑上的某一个服务程序

如果发送的是中文数据,则使用编解码

程序示例

sever_.py

import socket
import time
sk = socket.socket()
sk.bind(('127.0.0.1',18080))
sk.listen()# 开机
print(123)
conn,addr = sk.accept()msg_r = conn.recv(10)# 接受数据,接受10个字节
print(msg_r.decode('utf-8'),addr)
conn.close()
sk.close()

client_.py

import socket
import time
sk = socket.socket()sk.connect(('127.0.0.1',18080))# 连接sk.send('中文'.encode('utf-8'))sk.close()

服务器端收到效果:

简易聊天程序

基于以上代码,将此改成,可以一直聊天的逻辑,并且带 标识退出的的逻辑,程序示例:
sever_2.py

import socketsk = socket.socket()sk.bind(('127.0.0.1',10086))
sk.listen()
conn,addr = sk.accept()while 1:mess = conn.recv(1024)print(mess.decode('utf-8'))if mess == 'q':breakmess2 = input('服务器端发送消息:')conn.send(mess2.encode('utf-8'))if mess2 == 'q':breakconn.close()
sk.close()

client_2.py

import socketsk = socket.socket()sk.connect(('127.0.0.1',10086))while 1:mess = input('客户端发送消息:')sk.send(mess.encode('utf-8'))if mess == 'q':breakmess2 = sk.recv(1024)print(mess2.decode('utf-8'))if mess2 == 'q':breaksk.close()

效果展示:
客户端:

服务器端:

能实现聊天,但是,这样也有一种问题,如果再开一个客户端给服务器发消息,则服务器端收不到第二个客户端发的消息,就像服务器在接电话,第三者给他打电话就不行。那如果想接第三者的电话,必须先挂断正在进行的通话。
服务器端的代码可以试着这样改:

import socketsk = socket.socket()sk.bind(('127.0.0.1',10086))
sk.listen()
while 1:conn,addr = sk.accept() # 一直接电话while 1:mess = conn.recv(1024)print(mess.decode('utf-8'))if mess == 'q':breakmess2 = input('服务器端发送消息:')conn.send(mess2.encode('utf-8'))if mess2 == 'q':breakconn.close()
sk.close()

效果:
客户1:

服务器端:

客户2:

这样能实现服务器与多个客户端轮流聊天,但是这里明显有一个缺陷,服务器端需要先挂断当前聊天才能与下一个客户端聊天,不能实现同时与多个客户端聊天。udp 就没有这个问题,可以说是相当强大了。

三、基于UDP协议的socket


可以看出,udp相比于tcp逻辑更简单,这意味着代码量会更少,并且最最重要的是服务器端可以同时和多个客户端通信。

基于UDP协议的简易聊天程序

sever_3.py

import socketsk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8990))while 1:s ,addr =sk.recvfrom(1024)print(s.decode('utf-8'))mess = input('服务器端发送消息:')sk.sendto(mess.encode('utf-8'), addr)sk.close()

client_3.py

import socketsk = socket.socket(type=socket.SOCK_DGRAM)
while 1:mess = input('客户端发送消息:')sk.sendto(mess.encode('utf-8'),('127.0.0.1',8990))s, addr = sk.recvfrom(1024)print(s.decode('utf-8'))sk.close()

效果:
客户端1:

服务器端:

客户2:

这样一个服务器端可以和多个客户端同时通信,从实用性上看,可以明显感觉到UDP用着更便捷。

改进,署名,输出带颜色

上面的客户端看着比较丑陋,咱们把客户端名字调整一下,并在服务器端输出文字带颜色,看起来更炫酷。
首先看一下颜色表,
图片截自:pycharm控制台输出带颜色
示例:

print('\033[31m你好~\033[0m')

效果:

万事具备,开搞:

sever_.py

import socketsk = socket.socket(type=socket.SOCK_DGRAM)# udp协议
sk.bind(('127.0.0.1',8090))
# 需求: 根据每个客户端的名字,去加上颜色
dic = {'悟空':'\033[32m','张三丰':'\033[33m','赵敏':'\033[35m'}
# 收发
while 1:msg_r,addr = sk.recvfrom(1024)# 接收来自于哪里的消息msg_r = msg_r.decode('utf-8')name = msg_r.split(':')[0].strip()color = dic.get(name,'')# get(key,default)  获取字典中key对应的value,如果没有key则返回defaultprint('%s %s \033[0m'%(color,msg_r))msg_s = input(('>>>'))sk.sendto(msg_s.encode('utf-8'),addr)# 发给谁的消息sk.close()

client_.py

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)# udp协议
name = input('请输入您的名字:')
# 收发
while 1:msg_s = input(('>>>'))info = name + ' : ' + msg_ssk.sendto(info.encode('utf-8'), ('127.0.0.1',8090))  # 发给谁的消息msg_r,addr = sk.recvfrom(1024)# 接收来自于哪里的消息print(msg_r.decode('utf-8'))sk.close()

客户1:

客户2:

最终服务器端效果:

读书正能量分享

越来越糟,还是会侥幸变好,取决于你的努力,以及面对大方向的选择,这基本取决于一个人一生的浮沉。做一个努力的人的好处在于,人人见了你都想帮你,如果你自己不做出一点努力的样子,人家想拉你一把,都不知道你的手在哪里。
——刘同 《向着光亮那方》

网络编程之套接字socket相关推荐

  1. [python学习] 专题七.网络编程之套接字Socket、TCP和UDP通信实例

    很早以前研究过C#和C++的网络通信,参考我的文章:                  C#网络编程之Tcp实现客户端和服务器聊天                 C#网络编程之套接字编程基础知识   ...

  2. 网络编程:套接字socket函数与绑定信息bind函数

    套接字socket函数与绑定信息bind函数 套接字 绑定信息(绑定IP和端口) socket函数 bind函数 struct sockaddr结构体的组成: struct sockaddr_in结构 ...

  3. 网络编程 2 套接字socket

    socket简介 1.不同电脑间的进程之间如何通信 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起! 在1台电脑上可以通过进程号(PID)来唯一标识一个进程,但是在网络中这是行不通的. 其实T ...

  4. 网络编程:套接字 socket

    复习一下,先复习下简单的套接字. 好记性不如烂笔头,烂笔头不如烂键盘,烂键盘好过没键盘. Windows下............................................... ...

  5. python socket清空接收缓冲区_Python网络编程——修改套接字发送和接收的缓冲区大小...

    很多情况下,默认的套接字缓冲区大小可能不够用.此时,可以将默认的套接字缓冲区大小改成一个更合适的值. 1. 代码 # ! /usr/bin/env python # -*- coding: utf-8 ...

  6. Linux原始网络编程,Linux操作系统网络编程 原始套接字 (1)

    Linux操作系统网络编程--原始套接字 (1) http://soft.zdnet.com.cn/software_zone/2007/1020/568223.shtml 我们在前面已经学习过了网络 ...

  7. Linux网络编程——原始套接字编程

    Linux网络编程--原始套接字编程 转自:http://blog.csdn.net/tennysonsky/article/details/44676377 原始套接字编程和之前的 UDP 编程差不 ...

  8. TCP/IP网络编程:P1->理解网络编程和套接字

    本系列文章为<TCP/IP网络编程----尹圣雨>学习笔记 文章目录 一.理解网络编程和套接字 1.1 构建接电话套接字 1.2 编写"Hello world!"服务器 ...

  9. C# 网络编程之套接字编程基础知识

    最近阅读了周存杰编写的<C#网络编程实例教程>并阅读了很多相关方面的资料,同时自己也做了一些套接字编程方面的C#程序,所以根据它的知识总结了最近的套接字编程的一些知识点,方便自己的理解与他 ...

最新文章

  1. java原子变量的作用_AtomicInteger原子类的作用介绍(代码示例)
  2. SVG(H5可缩放的矢量图形)
  3. POJ 2778 DNA Sequence (自动机DP+矩阵快速幂)
  4. mysql util_关于mysql数据库操作工具类MySQLUtils用于连接数据提交sql脚本及结果转为JSONArray等操作...
  5. econtrol窗体设计器
  6. python弹球游戏绑定鼠标事件_用python和pygame游戏编程入门-弹球[鼠标控制]
  7. 关于相似性度量与各类距离的意义
  8. Oculus cv1 input
  9. C#选项卡TabControl控件隐藏指定选项卡的办法,任意不支持隐藏属性的实现办法详解
  10. socket的tcp连接中的监听套接字和已连接套接字
  11. 移动端车牌识别sdk
  12. 微博 用户画像_新浪微博数据采集方法以及数据分析(用户画像) - 八爪鱼采集器...
  13. 骑在银龙的背上歌词(带罗马音)
  14. php获得视频文件扩展名,php 获取文件扩展名的 n 种方法
  15. 日本流行语------收录
  16. win10用户权限设置计算机管理权限,win10系统怎么取得完美管理员权限
  17. 智能风控中台设计与落地
  18. 海南大学计算机学院唐朝胜,海南大学2011年12月新增博、硕导名单
  19. python中计算区间内的质子数
  20. windows笔记本重置网络

热门文章

  1. c#批量下载图片并存储到本地
  2. linux全屏时钟应用下载,全屏时钟app下载-全屏时钟(azar Flip clock)app手机版v1.1.1-电玩之家...
  3. POI操作Excel实例之将文本内容格式化导入Excel
  4. 如何配置DirectX开发环境
  5. Ubuntu python-pip换源
  6. 流量卡之家:5G能够带来行业利益 但不应该过分神化5G网络
  7. word中如何设置首页无页码,页码从第二页开始?(前两页页码格式与后文不同)
  8. 【算法练习】MVP争夺战
  9. python-代码实战-爬取新闻标题
  10. Kubernetes各组件工作原理 Pod 生命周期