一、socket初识

①服务端

import socket

server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5) # 半连接池 conn, addr = server.accept() # 待机等待接听电话 data = conn.recv(1024) # 接听别人说话,只接收1024字节
print(data)
conn.send(b'hello girl') # 跟别人说话 conn.close() # 关闭通信连接
server.close() # 关闭服务端

②客户端

import socket

client = socket.socket()
client.connect(('127.0.0.1', 8080)) client.send(b'hello how much?')
data = client.recv(1024)
print(data) client.close()

二、通信循环

①服务端

服务端:
有固定的ip和port
24小时不间断提供服务 import socket server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5) conn, addr = server.accept() while True:
try:
data = conn.recv(1024)
if len(data) == 0:break
print(data)
conn.send(data.upper())
except ConnectionResetError:
break conn.close()
server.close()

②客户端

import socket

client = socket.socket()
client.connect(('127.0.0.1', 8080)) while True:
msg = input('>>>:').encode('utf-8')
if len(msg) == 0: continue
client.send(msg)
data = client.recv(1024)
print(data)

三、链接循环

①服务端

import socket

server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5) while True:
conn, addr = server.accept() while True:
try:
data = conn.recv(1024)
if len(data) == 0:break
print(data)
conn.send(data.upper())
except ConnectionResetError:
break conn.close()
server.close()

②客户端

import socket

client = socket.socket()
client.connect(('127.0.0.1', 8080)) while True:
msg = input('>>>:').encode('utf-8')
if len(msg) == 0: continue
client.send(msg)
data = client.recv(1024)
print(data)

四、粘包问题的产生

1、粘包问题

  接收方:我不知道我要接收的数据的总长度

  发送方:由于tcp协议的内部优化算法 会将数据量比较小的并且时间间隔比较短的数据一次性打包发送

2、如何解决

  ①发送数据直接先告诉对方数据量的大小

  ②利用struct模块定制我们自己的消息传输协议

3、最终版本解决粘包问题

  客户端:

    ①制作字典报头

    ②发送报头

    ③再发送字典

    ④再发你的真实数据

  服务端:

    ①先收4个长度的报头

    ②解析报头,获取字典长度

    ③接收字典(反序列化) ——>> 获取字典里面所有信息

    ④接收真实数据

五、TCP协议特点:会将数据量比较小的并且时间间隔比较短的数据一次性打包发送

①服务端

import socket

server = socket.socket()
server.bind(('127.0.0.1',8088))
server.listen(5) # 半连接池 conn,addr = server.accept()
data = conn.recv(5) # 指定收到数据量的大小为5个,如果不指定,还是1024,就会出现粘包现象
print(data) # b'hello' data = conn.recv(5)
print(data) # b'hello' data = conn.recv(4)
print(data) # b'hell'

②客户端

import socket

client = socket.socket()
client.connect(('127.0.0.1',8088)) client.send(b'hello')
client.send(b'hello')
client.send(b'hello')

六、struct模块

import struct

data = 'dfsafsagdsfgfafsdafsdafafryuio'

# 服务端
res = struct.pack('i', len(data)) # 打包:把一个数据打包为长度固定为4
print(len(res)) #
print(res) # b'\x1e\x00\x00\x00' # 客户端
ret = struct.unpack('i', res)[0] # 解包:数据真实长度
print(ret) #

socket编程相关阐述的更多相关文章

  1. socket编程相关的结构体和字节序转换、IP、PORT转换函数

    注意:结构体之间不能直接进行强制转换, 必须先转换成指针类型才可以进行结构体间的类型转换, 这里需要明确的定义就是什么才叫强制转换. 强制转换是将内存中一段代码以另一种不同类型的方式进行解读, 因此转 ...

  2. PHP Socket 编程进阶指南

    学习准备 Linux 或者 Mac 环境: 安装有 Sockets 扩展: 了解 TCP/IP 协议. socket函数只是PHP扩展的一部分,编译PHP时必须在配置中添加 --enable-sock ...

  3. Java Socket编程如何建立两者关系

    转自:http://developer.51cto.com/art/201003/190582.htm Java Socket编程需要大家详细的学习,有关的技术一直在不断的更新.那么要如何才能掌握好有 ...

  4. Python C/S架构,网络通信相关名词,socket编程

    主要内容: 一.  C/S架构 二. 网络通信的相关名词 三. socket编程 一. C/S架构和B\S架构概述 1. C/S架构: Client/Server(客户端/服务端)架构 描述: C/S ...

  5. Socket编程(摘抄)

    http://www.blogjava.net 例子代码就在我的博客中,包括六个UDP和TCP发送接受的cpp文件,一个基于MFC的局域网聊天小工具工程,和此小工具的所有运行时库.资源和执行程序.代码 ...

  6. Socket编程指南及示例程序

    例子代码就在我的博客中,包括六个UDP和TCP发送接受的cpp文件,一个基于MFC的局域网聊天小工具工程,和此小工具的所有运行时库.资源和执行程序.代码的压缩包位置是http://www.blogja ...

  7. Socket编程指南及示例程序(转)

    1         前言 在一些常用的编程技术中,Socket网络编程可以说是最简单的一种.而且Socket编程需要的基础知识很少,适合初学者学习网络编程.目前支持网络传输的技术.语言和工具繁多,但是 ...

  8. win32 socket 编程(三)——TCP/IP

    一.TCP/IP解析 TCP/IP协议的核心部分是传输层协议(TCP.UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中实现.因此用户一般不涉及.编程时,编程界面有两种形式: 1. ...

  9. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

随机推荐

  1. spring boot-8.静态资源映射

    1.webjars WebJars是将客户端(浏览器)资源(javascript,Css等)打成jar包文件,以对资源进行统一依赖管理.WebJars的jar包部署在Maven中央仓库上.官网地址:h ...

  2. 【转】mysql的group_concat函数,默认最大长度是1024

    mysql的group_concat函数,默认最大长度是1024 查询sql: show variables like 'group_concat_max_len'; 设置方式: 修改配置文件my.i ...

  3. 【洛谷p1058】立体图(已完结)

    立体图[题目链接] 然后因为有点(不是有点,非常)懵,因此我只能看一步写一步. 首先总体思路: 将三维立体图看做二维平面图,先确定出二维图的长和宽,然后,按照三维立体图的透视顺序,从最后一排的最左开始 ...

  4. Luogu P2572 序列操作

    (是道线段树好题√) 题目链接 题外话:这道题我也不知道卡了自己多少天,从初赛之前就开始做,一直到现在才a掉(时间跨度得有将近十天了吧?) 线段树,嗯,好像很简单的样子. 但事实上因为自己太菜了,卡了 ...

  5. [codeforces1234F]Yet Another Substring Reverse

    题目链接 大致题意为将某个子串进行翻转后,使得不包含相同字符的字符子串长度最长.只能翻转一次或零次. 设一个子串的状态为包含字符的二进制.如子串为$abacd$,则状态为$00000000000000 ...

  6. 模板渲染JinJa2

    模板渲染JinJa2 ​ 可以从数据库中查询数据,然后去替换我html中的对应内容(专业名词叫做模板渲染,你先渲染一下,再给浏览器进行渲染),然后再发送给浏览器完成渲染. 这个过程就相当于HTML模板 ...

  7. 从入门到自闭之python初识

    Day 01 整型: 对比: 在python 2 版本中有整型,长整型long 在python 3 版本中全部都是整型 用于计算和比较 整型和布尔值的转换 二进制转换成十进制: ​print (int ...

  8. PHP 模拟http 请求

    php 模拟请求类 <?php /** * fangdasheng * http 模拟请求 */ class Myhttp { private $apiUrl; // 构造函数 public f ...

  9. Elasticsearch入门教程(三):Elasticsearch索引&映射

    原文:Elasticsearch入门教程(三):Elasticsearch索引&映射 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文 ...

  10. 一、json数组的键和值

    一.json数组的键和值 https://blog.csdn.net/sinat_30224769/article/details/51702203 string test_json = " ...