网络编程

  1.tcp协议

#tcpserver
#单纯一对一发
tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建tcp套接字 参数(ipv4,tcp)
tcp.bind(('127.0.0.1', 8000)) # 为服务端创建本地绑定信息 参数为元组 '' 代表绑定本地 端口要求int类型
tcp.listen() # listen(n)监听模式 默认套接字变为被动等待为触发
client_socket, clent_socket_address = tcp.accept() # 阻塞 等待客户端连接 返回值为元组 (socket套接字,客户端的地址)
while True:
if client_socket:
print("连接成功!")
print("client_socket:", client_socket)
print("clent_socket_address:", clent_socket_address)
recv = client_socket.recv(1024) # 服务端 接收 1024为接收的最大数据大小
print("-->:", recv.decode('utf-8'))
client_socket.send('这里是rainbol的客户端请求'.encode('utf-8')) # 服务端回复,服务端发送时需要bytes类型
client_socket.close()
tcp.close()
#tcpclient
#客户端
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_socket.connect(('127.0.0.1',8000))
while True:
data = input('-->:')
tcp_socket.send(data.encode('utf-8'))#把字符串转成二进制,并把发送data
recv_data = tcp_socket.recv(1024)# 接收服务端返回的消息
print('-->%s'%recv_data.decode('utf-8'))
tcp_socket.close()

  粘包问题

#client
'''
黏包现象:tcp传输过程中基本传输1500字节后就要进行分包处理,发送端默认进行拆包,接收端进行合包 一种是因为发送数据包时,每次发送的包小,因为系统进行优化算法,就将两次的包放在一起发送,减少了资源的重复占用。多次发送会经历多次网络延迟,一起发送会减少网络延迟的次数。因此在发送小数据时会将两次数据一起发送,而客户端接收时,则会一并接收。#即出现多次send会出现黏包 第二种是因为接收数据时,又多次接收,第一次接收的数据量小,导致数据还没接收完,就停下了,剩余的数据会缓存在内存中,然后等到下次接收时和下一波数据一起接收。 为了校验数据的完整 ''' '解决黏包:本质是因为我们在传输时不知道该数据包到底多大,取决于服务端和客户端相互协定如下方式'
import socket
import struct
soc = socket.socket()
soc.connect(('127.0.0.1',9000))
msg = b'hello'
msg_len = struct.pack('i',len(msg))#反正粘包现象,使用struct模块发送tcp数据时一开始告诉服务器发送字节数的大小,struct的i参数可以把8位数字节数以4个字节数类似'/SAD/sadsa/sad/sadasd'先发送给服务端
soc.send(msg_len)
soc.send(msg) msg = b'world'
msg_len = struct.pack('i',len(msg))
soc.send(msg) soc.close()
#server
import socket
import struct
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1',9000))
server.listen()
client_socket, clent_socket_address = server.accept()
get_lens = client_socket.recv(4)#先拿4个字节
get_size = struct.unpack('i',get_lens)[0] #拿到数据长度
msg1 = client_socket.recv(get_size) #再接收所有数据
print(msg1) get_lens = client_socket.recv(4)#先拿4个字节
get_size = struct.unpack('i',get_lens)[0] #拿到数据长度
msg2 = client_socket.recv(get_size)
print(msg2)

  2.udp协议

#server
import socket
soc = socket.socket(type=socket.SOCK_DGRAM)#默认tcp如果变成udp要加SOCK_DGRAM
soc.bind(('127.0.0.1',9000))
ret,client_addr = soc.recvfrom(1024)
print(ret)
soc.sendto(b'ok',client_addr)#返回给客户端接收成功
soc.close()
#client
import socket
soc = socket.socket(type=socket.SOCK_DGRAM)
ret = soc.sendto(b'helloworld',('127.0.0.1',9000)) #参数一:想要发送的byte字节,参数二:想要发送给谁的地址
msg = soc.recv(1024)#接收服务端返回结果
print(msg)
soc.close()

操作socket笔记的更多相关文章

  1. MySQL4.0命令操作学习笔记

    声明:下列内容并非原创,仅仅是最近学习笔记整理. -------------------------------------- 进入mysql安装路径bin目录下: 1.开启服务 winmysqlad ...

  2. socket笔记

    参考: http://www.cnblogs.com/dolphinX/p/3460545.html http://www.cnblogs.com/wei2yi/archive/2011/03/23/ ...

  3. linux c socket笔记 -服务端

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types. ...

  4. C# Socket笔记

    看到这个题目,是不是很眼熟?在博客园里搜下,保证会发现关于这个东东的文章实在是太多了~~~真得是没有写得必要,而且我也有点懒得去琢磨字句.(看到这,肯定得来个转折的了,不然就看不到下文了,不是吗)但是 ...

  5. python操作socket

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...

  6. 侠说java8--Stream流操作学习笔记,都在这里了

    前言 首次接触到Stream的时候以为它是和InputStream.OutputStream这样的输入输出流的统称. 流和集合的前世今生 概念的差异 在开发中,我们使用最多的类库之一就是集合.集合是一 ...

  7. 吴裕雄--天生自然HADOOP操作实验学习笔记:使用hive操作hbase

    实验目的 熟悉hive和hbase的操作 熟悉hadoop.hbase.hive.zookeeper的关系 熟练大数据环境的搭建 学会分析日志排除问题 实验原理 1.hive整合hbase原理 前面大 ...

  8. 吴裕雄--天生自然HADOOP操作实验学习笔记:分布式及RPC通信简介

    实验目的 掌握GOF设计模式的代理模式 了解掌握socket编程.java反射.动态代理 了解NIO.多线程 掌握hadoop的RPC框架使用API 实验原理 1.什么是RPC 在hadoop出现以前 ...

  9. TCP IP SOCKET 笔记

    网络由下往上分为 物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层, 三者从本质上来说没有可 ...

随机推荐

  1. 【C/C++开发】C++库大全

    C++特殊限定符(1)--static 当static来修饰类数据成员时,这个类的所有对象都可以访问它.因为值在内存中持续存在,它可以被对象有效共享.这意味着当一个对象改变static数据成员的值时, ...

  2. Caused by: java.lang.NullPointerException: Location is required

    将 Parent root = FXMLLoader.load(getClass().getResource("xml/MainUI.fxml")); 改为: Parent roo ...

  3. Appium移动自动化测试-----(十一)appium API 之键盘操作

    模拟键盘输入也是非常重要的操作.这一小节来介绍那些关于键盘的操作. 1.sendKeys()方法 方法: sendKeys() 用法: driver.findElements(By.name(&quo ...

  4. java后台面试之计算机网络问题集锦

    1.http和https的区别 2.对称加密和非对称加密 3.三次握手与四次挥手的流程 4.为什么TCP需要三次握手?两次不可以吗?为什么 5.为什么TCP挥手需要四次?三次不行吗? 6.TCP协议如 ...

  5. [转帖]五分钟彻底搞懂你一直没明白的Linux内存管理

    五分钟彻底搞懂你一直没明白的Linux内存管理 https://cloud.tencent.com/developer/article/1462476 现在的服务器大部分都是运行在Linux上面的,所 ...

  6. shell sed -i 指定内容追加.

    1.查看原文件中的内容 [root@testvm02 ~]# cat nrpe.cfg #command[check_users]=/usr/local/nagios/libexec/check_us ...

  7. java当中JDBC当中请给出一个DataSource的单态模式(SingleTon)HelloWorld例子

    [学习笔记] 2.DataSource的单态模式(SingleTon)程序 咱们还接着上面的例子来说.1万个人要看书.千万确保要只建立一个图书馆.要是一不留神,建了两个或三个图书馆,那可就亏大发了.对 ...

  8. STL源码剖析——空间配置器Allocator#2 一/二级空间配置器

    上节学习了内存配置后的对象构造行为和内存释放前的对象析构行为,在这一节来学习内存的配置与释放. C++的内存配置基本操作是::operator new(),而释放基本操作是::operator del ...

  9. go context 源码分析

    WithCancel func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { c := newCancelCtx(pare ...

  10. Kubernetes 学习笔记(一):基础概念

    个人笔记,仅本人查阅使用,不保证正确. 零.微服务 微服务架构专注于应用解耦合,通过将应用彻底地组件化和服务化,每个微服务只包含一个非常小的功能,比如权限管理.日志收集等等.由这一组微服务组合起来,提 ...