一、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. 3、APK file does not exist on disk

    参考:https://blog.csdn.net/ouyang_peng/article/details/51243441 亲测可以解决

  2. springboot - 应用实践(N)使用springboot内置的@Scheduled

    1.springboot开箱即用,内置调度任务的使用. 建一个简单的springboot工程,pom.xml: <?xml version="1.0" encoding=&q ...

  3. Vue.js官方文档学习笔记(三)创建Vue实例

    创建Vue实例 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的: var vm=new Vue({ //选项 }) Vue的设计受到了mvvm的启发 当创建一个 Vue 实 ...

  4. MYSQL 的事物处理(四大特性)

    什么是事物? MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库 ...

  5. Linux Firewalld 简明介绍

    防火墙作为保护服务器不受外部网络流量影响的一种方式.可以让用户定义一系列规则来控制外部网络中流入的流量,从而达到允许或阻塞的效果.firewalld 是防火墙服务的一个守护程序,实现了动态修改拥有 D ...

  6. DNS 缓存投毒

    原文:[DNS Cache Poisoning]( https://medium.com/iocscan/dns-cache-poisoning-bea939b5afaf) 译者:neal1991 w ...

  7. 缓存机制总结(JVM内置缓存机制,MyBatis和Hibernate缓存机制,Redis缓存)

    一.JVM内置缓存(值存放在JVM缓存中) 我们可以先了解一下Cookie,Session,和Cache Cookie:当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cooki ...

  8. shiro细节、默认的过滤器、匹配模式和顺序

    部分细节 [urls] 部分的配置,其格式是:“url=拦截器[参数],拦截器[参数]”: 如果当前请求的url匹配[urls] 部分的某个url模式,将会执行其配置的拦截器. anon(anonym ...

  9. springboot学习2

    项目导入eclipse 先检测是否安装有gradle插件 然后点击  finish 按钮 hello world实例 Application.java package com.example.demo ...

  10. java内存区域及溢出异常

    内存划分: java虚拟机在执行java程序过程中会把内存分为以下区域进行管理 线程私有的 虚拟机栈 局部变量表 基本数据类型 long和double占用两个slot 对象引用 返回地址 操作数栈 动 ...