socket基础篇
server_scoket.py
#!/usr/bin/env python3.5
# -*- coding:utf-8 -*-
import socket
import subprocess ip_port = ('0.0.0.0',9999) sk = socket.socket()
sk.bind(ip_port)
sk.listen(2) cid = 0 while True:
cid += 1
print('server waiting...')
try:
conn,addr = sk.accept()
# client_data = conn.recv(1024)
# print(str(client_data,'utf8'))
# conn.sendall(bytes('不要回答,不要回答,不要回答','utf8'))
while True:
try:
client_data = conn.recv(8192)
str_clinet_data = str(client_data,'utf8').strip() if not client_data.decode():
print("\033[1;31;0m客户端未发送数据!\033[0m")
break
print("接收数据,客户端%d:\033[1;31;0m%s\033[0m"%(cid,str_clinet_data))
cmd_data = subprocess.Popen(str_clinet_data,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
cmd_data_out , cmd_error = cmd_data.communicate() # 返回bytes
# if cmd_error != bytes("","utf-8"):
if cmd_error:
cmd_data_result = cmd_error
else:
cmd_data_result = cmd_data_out
try:
print(str(cmd_data_result,"gbk"))
except UnicodeDecodeError:
print(str(cmd_data_result,"utf-8"))
# conn.send(client_data)
cmd_result_size = b"CMD_RESULT_SIZE|%d"%len(cmd_data_result)
# print(cmd_result_size)
conn.send(cmd_result_size) client_ack = conn.recv(20)
if client_ack == b"CMD_RESULT_SIZE_OK":
print("收到客户端的确认,开始发送数据!")
conn.send(cmd_data_result)
except ConnectionResetError as e:
print(e)
print("\033[1;31;0m客户端%d关闭连接!\033[0m"%cid)
break
except KeyboardInterrupt as e:
print(e)
break
conn.close()
client.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
ip_port = ('192.168.5.124',9999) sk = socket.socket()
sk.connect(ip_port) # sk.sendall(bytes('请求占领地球','utf8'))
# server_reply = sk.recv(1024)
# print(str(server_reply,'utf8')) while True:
try:
user_input = input("cmd>>:").strip()
except KeyboardInterrupt as e:
print(e)
break
if user_input == "":
continue
if user_input == 'q':
break sk.send(bytes(user_input,'utf8'))
# print("发送数据: \033[1;32;0m%s\033[0m"%user_input) server_reply_size_data = sk.recv(50)
# print(server_reply_size_data)
server_reply_size_flag, server_reply_size = server_reply_size_data.decode("utf-8").split("|")
server_reply_size = int(server_reply_size)
if server_reply_size_flag == "CMD_RESULT_SIZE":
print("服务端将发送字节数:%d"%server_reply_size)
print("给服务端发送确认!")
sk.send(b"CMD_RESULT_SIZE_OK")
server_result = b""
recv_size = 0
# n = 1
while recv_size < server_reply_size:
server_reply = sk.recv(500)
server_result += server_reply
recv_size += len(server_reply)
print("共接收%d字节"%recv_size)
# code,server_result = str(server_reply[:9].split(b'0')[0],"utf-8"),server_reply[9:]
else:
print("------load-done-----")
print("\033[1;32;0m%s\033[0m"%str(server_result,"gbk"),end="")
# try:
# print("接收数据: \033[1;32;0m%s\033[0m"%str(server_reply,'utf-8'))
# except UnicodeDecodeError:
# print("接收数据: \033[1;32;0m%s\033[0m"%str(server_reply,'gbk')) sk.close()
环境:server运行在linux,client运行在linux和windows: 1、在windowns上用tskill pid时,windowns会发生rst包,且服务端if not data无法抓到,而是在
2、windows 上Ctrl + C ,linus上 kill pid、kill -9 pid 、Ctrl + c,客户端会发送fin来进行正常的结束会话
3、阻塞
开启多个客户端会发生阻塞,但是正常的tcp三次握手可以正常连接,只是发生过去的数据服务器会回应空数据的包。
及时我在客户端加了if not data: 也是没用的 ,应为如果recv()收到ack应该是会阻塞的(不确定,可能是这样)。
客户端还是卡住:
,且客户端和服务器端也没有数据传输。
某一个客户端结束会话后,这个客户端会马上收到服务器端的数据。
服务器端的recv()收到ack,recv()会阻塞。
4、客户端连接超过监听设置数。sk.listen(2),表示可以挂起两个。
第一个client在linux,然后再windows开了三个客户端,都可以连上(很奇怪),当在windows开启第四个client时,出现问题,如下:
这里服务器端的那个端口为14378的连接已经断开。14378的客户端再发生数据库如下:
客户端一个一个断开后,挂起的客户端收到服务器的数据,客户端的recv()一个个被"激活"。
但是当server起在windows时,确实只能挂起两个:
为了抓包,第四个客户端在linux发起:
5、当发送数据为空或回车时,send()会阻塞:
红框的包是以前的。
socket基础篇的更多相关文章
- python网络编程——socket基础篇
python的网络编程比c语言简单许多, 封装许多底层的实现细节, 方便程序员使用的同时, 也使程序员比较难了解一些底层的东西. 1 TCP/IP 要想理解socket,首先得熟悉一下TCP/IP协议 ...
- python之-- socket 基础篇
socket 网络模块 注意事项:在python3中,所有数据的传输必须用bytes类型(bytes只支持ascii码)所以在发送数据的时候要么在发送的字符串前面加 'b',要么使用encode('u ...
- iso socket基础2
iPhone socket 编程之BSD Socket篇 收藏在进行iPhone网络通讯程序的开发中,不可避免的要利用Socket套接字.iPhone提供了Socket网络编程的接口CFSocket, ...
- [C# 基础知识梳理系列]专题六:泛型基础篇——为什么引入泛型
引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...
- Jenkins: 基础篇(环境配置)
自动化领域比较有影响力的开源框架jenkins,确实比较强大,易用.很多公司将其用来做持续即成CI(continuous integration).为了拓展和强化自己的软件设计生态系统,也将很久前使用 ...
- C# Socket基础(一)之启动异步服务监听
本文主要是以代码为主..NET技术交流群 199281001 .欢迎加入. //通知一个或多个正在等待的线程已发生事件. ManualResetEvent manager = new ManualRe ...
- python之路基础篇
基础篇 1.Python基础之初识python 2.Python数据类型之字符串 3.Python数据类型之列表 4.Python数据类型之元祖 5.Python数据类型之字典 6.Python Se ...
- Python学习笔记基础篇——总览
Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...
- 撸基础篇系列,JAVA的NIO部分
前言:撸基础篇系列,避免每次都要从头开始看,写个自己的知识体系树 NIO 核心就是异步, 比如,复制文件,让操作系统去处理,等通知 BIO核心类 一,BIO NIO基本操作类 Bytebuffer 构 ...
随机推荐
- 三维GIS
三维GIS数据结构 三维GIS数据库 三维渲染显示 点云处理 cnki:http://kns.cnki.net/kns/brief/default_result.aspx
- rsync服务搭建--2018.5.8 [优化后最终版]
2018年5月8日 22:09:38 第一步配置基础环境(按照自己的规划配置并非每人的环境都一致) 第一台服务器(RSYNC服务器): rsync外网地址:10.0.0.41 rsync内网地址:1 ...
- Python的特殊属性和魔法函数
python中有很多以下划线开头和结尾的特殊属性和魔法函数,它们有着很重要的作用. 1.__doc__:说明性文档和信息,python自建,不需要我们定义. # -*- coding:utf- -*- ...
- nginx负载均衡tomcat和配置ssl
目录 tomcat 组件功能 engine host context connector service server valve logger realm UserDatabaseRealm 工作流 ...
- kali linux之手动漏洞挖掘二
漏洞挖掘原则/宗旨----所有变量,所有头(cookie中的变量),逐个变量删除 身份认证 常用若口令/基于字典的密码爆破/锁定帐号 信息收集(手机号,身份证,住址信息等等) 密码嗅探 会话sessi ...
- winform程序使用clickonce方式发布之后点击安装没反应
可能是少了index.html和web.config两个文件,这两个文件为什么没有在发布的时候生成,还有怎么影响安装的后续研究
- 洛谷P4502 [ZJOI2018]保镖(计算几何+三维凸包)
题面 传送门 题解 我对计蒜几盒一无所知 顺便\(xzy\)巨巨好强 前置芝士 三维凸包 啥?你不会三维凸包?快去把板子写了->这里 欧拉公式 \[V-E+F=2\] \(V:vertex\)顶 ...
- 洛谷P4557 [JSOI2018]战争(闵可夫斯基和+凸包)
题面 传送门 题解 看出这是个闵可夫斯基和了然而我当初因为见到这词汇是在\(shadowice\)巨巨的\(Ynoi\)题解里所以压根没敢学-- 首先您需要知道这个 首先如果有一个向量\(w\)使得\ ...
- sed的基本用法
了解sed的基本参数 sed匹配的方法: '//'p, 此符号与grep的引号类似,但sed是一定加此符号的,且还要加上-n的参数,匹配起来相当麻烦.sed匹配的方法: '//'pI 加上I的参数是指 ...
- 红蓝对抗 - 蓝队手册(BTFM)(转载)
本文已发表在嘶吼RoarTalk,未经授权,请勿转载! http://www.4hou.com/technology/10173.html 最佳阅读体验版:https://stackedit.io/v ...