网络编程三 Socket
1.根据netstat端口的找到进程号---->根据进程号找到进程名称-------->终止进程
1) netstat 最后一列是5432
C:\Users\Administrator> netstat -ano|findstr 8848
TCP 127.0.0.1:8848 0.0.0.0:0 LISTENING 5432
2) tasklist核实进程名称以及内存占用情况
C:\Users\Administrator>tasklist /fi "PID eq 5432" 映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
python.exe 5432 Console 1 10,576 K
3) taskill 终止进程
C:\Users\Administrator>tskill 5432
4) 再次查看已经消失
socket和tcp的对应关系

socket简单编程
ps:无论是服务端还是客户端,当发出send命令时,就会进入recv状态
recv(n) n代表的就是接受的最大字节数

粘包现象:
接收方没有及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)
解决方法:
服务端
import socket
import subprocess
import struct
skt_s = socket.socket()
skt_s.bind(("127.0.0.1",8888))
skt_s.listen(10)
while 1:
conn,addr = skt_s.accept()
n = 1
while 1:
try:
cmd = conn.recv(1024)
cmd_str = cmd.decode("utf-8")
if cmd_str.upper() == "Q":
break
obj = subprocess.Popen(cmd_str,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
std_out = obj.stdout.read()
std_err = obj.stderr.read()
std = std_out + std_err
std_size = len(std)
std_bytes = struct.pack('i',std_size)
print(std_bytes)
conn.send(std_bytes)
conn.send(std)
print("服务器收到的第%s的回应" %n)
n += 1
except ConnectionResetError:
break
conn.close()
客户端
import socket
import struct
skt_c = socket.socket()
skt_c.connect(("127.0.0.1",8888))
while 1:
msg = input(">>>")
if msg.upper() == "Q":
break
if msg:
skt_c.send(msg.encode("utf-8"))
std_bytes = skt_c.recv(4)
len_size = struct.unpack('i',std_bytes)
print(len_size)
total_data = b''
while len(total_data) < len_size[0]:
total_data += skt_c.recv(1024)
print(total_data.decode("gbk"))
else:
print("输入不能为空")
skt_c.close()
高级版解决粘包现象:
服务端:
import subprocess
import socket
import json
import struct srv = socket.socket()
srv.bind(("127.0.0.1", 8848))
srv.listen(10)
while 1:
conn, addr = srv.accept()
while 1:
try:
cmd = conn.recv(1024)
cmd_str = cmd.decode("utf-8")
obj = subprocess.Popen(cmd_str,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
std = obj.stdout.read() + obj.stderr.read()
std_len = len(std)
# 结果长度封装到字典dic中
dic = {"file_size": std_len}
# 将字典dic变成json格式的字符串 dic_json
dic_json = json.dumps(dic)
# 将dic_json字符串变成字节
dic_json_byte = dic_json.encode("utf-8")
# 求下变成字节后总共有多少个长度
dic_json_byte_len = len(dic_json_byte)
# 将dic_json_byte_len变成固定长度的struct格式的字节
dic_json_byte_struct = struct.pack("i", dic_json_byte_len)
print(dic_json_byte_struct)
# 发送前四个字节
conn.send(dic_json_byte_struct)
conn.send(dic_json_byte)
conn.send(std)
except Exception:
break
conn.close()
客户端:
import struct
import socket
import json cli = socket.socket()
cli.connect(("127.0.0.1",8848))
while True:
try:
cmd = input(">>>")
if cmd.upper() == "Q":
break
elif cmd:
cli.send(cmd.encode("utf-8"))
dic_json_byte_struct = cli.recv(4)
# 将dic_json_byte_struct变成int长度
dic_json_byte_len = struct.unpack("i",dic_json_byte_struct)[0]
# 接收上步得到的长度个字节
dic_json_byte = cli.recv(dic_json_byte_len)
# 变成json格式的字符串
dic_json = dic_json_byte.decode("utf-8")
# 将json变成字典
dic = json.loads(dic_json)
# 获取出数据的总长度
ret_size = dic["file_size"]
total_data = b""
while len(total_data) < ret_size:
total_data += cli.recv(1024)
print(total_data.decode("gbk"))
else:
print("命令不能为空!")
except Exception:
break
cli.close()
网络编程三 Socket的更多相关文章
- Linux网络编程(三)
Linux网络编程(三) wait()还是waitpid() Linux网络编程(二)存在客户端断开连接后,服务器端存在大量僵尸进程.这是由于服务器子进程终止后,发送SIGCHLD信号给父进程,而父进 ...
- java基础-网络编程(Socket)技术选型入门之NIO技术
java基础-网络编程(Socket)技术选型入门之NIO技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传统的网络编程 1>.编写socket通信的MyServer ...
- 网络编程与socket套接字
网络编程与socket套接字 传输层 PORT协议 port是一种接口,数据通过它在计算机和其他设备(比如打印机,鼠标,键盘或监视器)之间,网络之间和其他直接连接的计算机之间传递 TCP协议 传输 ...
- python 网络编程:socket(二)
上节地址:Python网络编程:socket 一.send和sendall区别 send,sendall ret = send('safagsgdsegsdgew') #send 发送 ...
- Linux高并发网络编程开发——10-Linux系统编程-第10天(网络编程基础-socket)
在学习Linux高并发网络编程开发总结了笔记,并分享出来.有问题请及时联系博主:Alliswell_WP,转载请注明出处. 10-Linux系统编程-第10天(网络编程基础-socket) 在学习Li ...
- Python之路(第三十篇) 网络编程:socket、tcp/ip协议
一.客户端/服务器架构 1.硬件C/S架构(打印机) 打印机作为一个服务端,电脑连接打印机进行打印 2.软件C/S架构 互联网中处处是C/S架构 如谷歌网站是服务端,你的浏览器是客户端(B/S架构也是 ...
- Linux 网络编程三(socket代码详解)
//网络编程客户端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...
- 浅谈TCP/IP网络编程中socket的行为
我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...
- iOS 网络编程:socket
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
随机推荐
- openjudge真的慢啊
€openjudge真的慢啊
- windows+nginx 查看并发链接数
1.windows下nginx查看并发链接数要使用stable版本 2.配置代码: location /status { stub_status on; } 3.访问地址:http://localho ...
- 大数据面试题——如何找出访问最多的IP
问题描述: 现有海量日志数据保存在一个超大的文件中,该文件无法直接存入内存,要求从 中提取某天访问BD次数最多的IP 分析解读: 由于这个题目只关心某一天访问次数最多的IP,因此可以首先对文件进行一次 ...
- python 常用网站
https://www.tutorialgateway.org/python-tutorial/
- GridView(多选功能)
多选功能 将optionSelection下的MultiSelect修改为true开启多选,MultiSelectMode有三种模式可选,单元格选择,行选择,与checkBox选择,第三种选择方式会 ...
- Unity3d对象池
Singleton.cs 12345678910111213 using UnityEngine;/// <summary>/// 单例模版类/// </summary>pub ...
- selenium中的alter弹框
from selenium import webdriverimport timedriver=webdriver.Chrome()driver.get('http://ui.imdsx.cn/uit ...
- Shell 有类型变量
1.通过 declare 和 typeset 命令 declare 和 typeset 两者等价 declare 和 typeset 都是用来定义变量类型的 下面以 declare 进行总结 2.de ...
- idea 控制到不能输出中文
解决办法:配置Tomcat的时候在VM options添加 -Dfile.encoding=UTF-8
- Python04(基础语法)
Trainning-day03回顾1.输出重定向 > 将输出到终端的内容输出到指定文件 命令 > 文件 注意: 1.如果文件存在,覆盖原文件 2.如果文件不存在,直接创建新文件2.输出追加 ...