一个初学者的辛酸路程-socket编程-8

前言:

你会发现会网络是多么幸福的事情

主要内容:

socket 概念:

socket本质上就是2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递。我们知道网络通信都是基于IP地址加短裤的方法来定位到目标的具体机器上的具体服务。操作系统有0-65535个端口,每个端口都可以独立对外提供服务,如果把一个公司比做一台电脑,那公司的总机号码就相当于IP地址,每个员工的分机号就相当于短裤,你想找公司某个人,必须先打电话到总机,然后再转分机。

这里提到了OSI七层模型的概念:

第一层:物理层

第二层:数据链路层

第三层: 网络层

第四层:传输层

第五层:会话层

第六层:表示层

第七层:应用层

建立一个socket必须至少有2端,1个是服务端,1个是客户端,服务端被动等待并接受请求,客户端主动发起请求,连接建立之后,双方可以互发数据。

建立一个链接,需要IPV4和IPV6

Socket Types

socket.SOCK_STREAM     #for tcp

socket.SOCK_DGRAM     #for  udp

socket.SOCK_RAW      #原始套接字

建立链接之后,就需要IP和端口了

排队数量,一般是5

sk.listen(backlog)

关闭套接字

sk.close()

接受套接字的数据

sk.recv(bufsize[,flag])

具体步骤

1、生成一个socket实例

server = socket.socket(AF_INET,SOCK_STREAM)

2、绑定地址

server.bind(‘0.0.0.0‘,8000)

3、监听端口排队5个

server.listen(5)

4、接受

talk_list = []

server.accept()   会返回2个值 conn 建立链接的线   client_addr 链接对象

talk_list.append(conn)

conn.send(‘sdfds‘)

另外一个介入进来

conn.recv(‘sdfsf‘)

5、发送

server.send()

6、关机

server.close()

上面是服务端

客户端通信

client = socket.socket(AF_INET,SOCK_STREAM)

client.connect(‘‘)

client.send

client.recv

接下来,就通过代码来实现这个服务端和客户端

server端

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Author: Leon xie

import socket

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

server.bind(("0.0.0.0",8000))

server.listen(5)

conn,client_addr = server.accept()

print(conn,client_addr)

while True:
    data = conn.recv(1024)  #1024字节
    print("recv from cli:",data)
    conn.send(b"got it")

client端

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Author: Leon xie

import socket

client = socket.socket()

client.connect(("localhost",8000))
while True:
    msg = input(">>:").strip()
    if len(msg) == 0:continue
    client.send(msg.encode())
    print("send ",msg)
    data = client.recv(1024)
    print("receive from server:",data)

再开一个client的时候,会出现堵死的情况,断开一个,另外一个可以使用了。

所以上面的可以改良

server端

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Author: Leon xie

import socket

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

server.bind(("0.0.0.0",8000))

server.listen(5)

while True:
    conn,client_addr = server.accept()
    print(conn,client_addr)

    while True:
        try:
            data = conn.recv(1024)  #1024字节
            print("recv from cli:",data)
            conn.send(b"got it")
        except ConnectionResetError as e:
            print(e)
            break

客户端

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Author: Leon xie

import socket

client = socket.socket()

client.connect(("localhost",8000))
while True:
    msg = input(">>:").strip()
    if len(msg) == 0:continue
    client.send(msg.encode())
    print("send ",msg)
    data = client.recv(1024)
    print("receive from server:",data)

接着写一个SSH连过去,执行命令的服务端和客户端

server端

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Author: Leon xie

import socket
import subprocess

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

server.bind(("0.0.0.0",8000))

server.listen(5)
print("=============start to listen============")
while True:
    conn,client_addr = server.accept()
    print(conn,client_addr)

    while True:

            data = conn.recv(1024)  #1024字节
            print("recv from cli:",data)
            res_obj = subprocess.Popen(data,shell=True ,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
            res = res_obj.stdout.read()
            conn.send(str(len(res)).encode())
            print("==res len:",len(res))
            conn.send(res)
            

客户端

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Author: Leon xie

import socket

client = socket.socket()

client.connect(("localhost",8000))
while True:
    msg = input(">>:").strip()
    if len(msg) == 0:continue
    client.send(msg.encode())
    print("send ",msg)

    data = client.recv(1024)
    print("res:",data.decode())
    res_len = int(data.decode())

    recevied_size = 0
    res = b‘‘
    while recevied_size < total_size:
        d = client.recv(1024)
        res += d

        recevied_size += len(d)
    print(res.decode())

最后做一个持续接受的server端和client端

服务端

[[email protected]127 ~]# cat server.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Author: Leon xie

import socket
import subprocess
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("0.0.0.0",8007))
server.listen(5)
print("--------------start to listen------------------")

while True:
    conn,client_addr = server.accept()
    print(conn,client_addr)

    while True:
            data = conn.recv(1024)
            print("recv from cli:",data)
            res_obj = subprocess.Popen(data,shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
            res = res_obj.stdout.read()
            conn.send(str(len(res)).encode())
            print("--res len:",len(res))
            conn.send(res)

客户端

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Author: Leon xie

import socket

client = socket.socket()

client.connect(("10.10.20.127",8005))

while True:

    msg = input(">>:").strip()
    if len(msg) == 0:continue

    client.send(msg.encode())
    print("send",msg)
    data = client.recv(1024)
    print("res:",data.decode())
    total_size = int(data.decode())
    #总长度跟已经收到的相等即可

    received_size = 0
    res=b‘‘
    while  received_size <total_size:
        d = client.recv(1024)
        res += d

        received_size += len(d)

    print("---------------rece done------------")
    print(res.decode())

完结。

时间: 2024-08-08 22:08:28

一个初学者的辛酸路程-socket编程-8的相关文章

一个初学者的辛酸路程-装饰器-5

前言: 继续前进 基础回顾: 1.集合 集合有2个重要作用:关系测试(并集,差集,交集)和去重. 2.文件编码 2.7上默认文件编码是ASCII码,因为不支持中文,就出了GB2312,在2.7上要支持中文就必须申明文件编码以UTF-8的格式,UTF-8与GB2312的关系? UTF-8是Unicode的扩展集合,Unicode包括全国地区的编码,中国很多开始程序还是以GBK的格式,GBK向下兼容GB2312,Windows默认编码是GBK. Unicode为何要做出来?为了节省空间,存英文中文都

一个初学者的辛酸路程-前端cs

一.主要内容 继续CSS 二.CSS 第一个: postion 网页有一类就是返回顶部,一直在右下角,还有打开一个网页顶部有个菜单,滚动滑轮,顶部永远在上面. position: fiexd  ==>固定在页面的某个位置,他可以结合上下左右来控制他的位置. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Tit

一个初学者的辛酸路程-jQuery

前言: 主要概要: 1.HTML+CSS补充 2.DOM事件 3.jQuery示例 内容概要: 1.布局 代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> body{ margin:0; } .w{ width:980px; margin:0

一个初学者的辛酸路程-初识Python-1

前言 很喜欢的一句话,与诸位共勉. 人的一切痛苦,本质上都是对自己无能的愤怒----王小波. 1.初识Python 首先,我们需要认识下面这位人物. 他是Python的创始人,吉多范罗苏姆(Guido van Rossum).1989的圣诞节为了打法时间开发出来的.哎,想想,都是差距.... 下面的一些概览我们需要理解: 1.C语言编译完就是机器码 2.CPU可以直接读取机器码 3.Python是用C写的 4.Python解释器会把代码内容读到内存里,通过Python解释器翻译成字节码 5.CP

一个初学者的辛酸路程-基于Django写BBS项目

前言 基于Django的学习 详情 登录界面 找个模板 http://v3.bootcss.com/examples/signin/ 右键,检查源码 函数 def login(request): errors = {} if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") user =

一个初学者的辛酸路程-线程与进程-10

前言: 不知道从什么时候起,面试总爱问线程与进程是神马?今天让你们爽个够. 主要内容:

遇见python的helloworld(一个初学者的心酸路程)

前言: 其实一开始写前言我是拒绝的,因为我觉得如果你是一个程序猿的话,至少要写个牛逼的代码来吸引各位看官,正如我前面所说,我真的是拒绝的,我写博文的原因只是为了记录自己学习的全过程,空杯心态,技术沉淀,希望能够遇到更完美的自己. 接下来,是我学习中的一点点小心得和点滴,来跟大家一起分享分享,水平有限,望包涵. 详细知识点 第一个知识点: 常言道:一个牛逼的程序员,需要精通各种语言的hello world,这是一种仪式感,很明显,我是一个很主要仪式感的人. 写个python的hello world

一个项目看java TCP/IP Socket编程

前一段时间刚做了个java程序和网络上多台机器的c程序通讯的项目,遵循的是TCP/IP协议,用到了java的Socket编程.网络通讯是java的强项,用TCP/IP协议可以方便的和网络上的其他程序互通消息. 先来介绍下网络协议:     TCP/IP         Transmission Control Protocol 传输控制协议         Internet Protocol 互联网协议     UDP         User Datagram Protocol 用户数据协议

使用libevent进行多线程socket编程demo

最近要对一个用libevent写的C/C++项目进行修改,要改成多线程的,故做了一些学习和研究. libevent是一个用C语言写的开源的一个库.它对socket编程里的epoll/select等功能进行了封装,并且使用了一些设计模式(比如反应堆模式),用事件机制来简化了socket编程.libevent的好处网上有很多,但是初学者往往都看不懂.我打个比方吧,1)假设有N个客户端同时往服务端通过socket写数据,用了libevent之后,你的server程序里就不用再使用epoll或是sele