网络编程

  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. console.log()和alert()的区别

    一直都是知道console.log()和alert()是有区别的,但是具体有什么区别就不清楚了,后来在权威指南里注意到了说alert()具有侵入性才来查一查两者的具体区别. 查询到的区别: alert ...

  2. 【MPEG】DVB / ATSC / ISDB区别

    硬件的区别: 欧洲“DVB标准”和美国“ATSC数字电视标准”的主要区别如下: (1)方形像素:在ATSC标准中采纳了“方形像素”(Square Picture Eelements),因为它们更加适合 ...

  3. Eclipse+TestNG搭建接口自动化测试框架

    一.环境安装 1.前提 安装好jdk 配置好Java环境变量 安装Eclips 这些网上都有,就不再详细介绍. 资源分享链接:http://pan.baidu.com/s/1v9Fw6 2.安装Tes ...

  4. LeetCode 792. 匹配子序列的单词数(Number of Matching Subsequences)

    792. 匹配子序列的单词数 792. Number of Matching Subsequences 相似题目 392. 判断子序列

  5. 自己实现CountDownLatch

    自己实现的CountDownLatch ,只是模拟他的功能而已.jdk中的实现采用的是AQS public class MyCountDownLatch { private final int tot ...

  6. 032 Android Service

    1.介绍 2.新建Service (1) (2)在Androidmanifest.xml文件中配置service <service android:name=".Myservice&q ...

  7. Linux下实现web服务器

    说明:暂时只是实现了静态网页的响应 #include <stdio.h> #include <sys/types.h> /* See NOTES */ #include < ...

  8. STM32中引脚复用说明

    端口复用的定义 STM32有许多的内置外设(如串口.ADC.DCA等等),这些外设的外部引脚都是和GPIO复用的.也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设 ...

  9. 剪贴板神器:Ditto

    ditto – 善用佳软 免费开源的 Windows 管理剪贴板,让你处理文字更高效:Ditto - 少数派

  10. Linux踢出登陆用户的正确姿势

    首先who(或w)查看需要杀死的终端名,然后执行: pkill -9 -t pts/? pkill相当于ps和kill的结合,用法和killall类似,根据进程名来杀死一类进程(kill是杀死单个) ...