套接字与套接字编程

对于刚刚学习计算机网络:自顶向下的同学们,在观看了中科大的视频---TCP Socket以及UDP

Socket会感到些许疑惑,不过没事,在这篇小文章将会为你解开Socket的神秘面纱

什么是Socket?:

Socket 是一套用于不同主机之间通信的API,工作在TCP/IP协议栈之上(传输层)。

socket在牛津字典里译为---插座,插孔。 我们称呼的时候叫它套接字,但是去理解它的时候可以以这个插座,插孔来思考。

比如说,将小明的主机,比作电冰箱,而服务器主机比作插座;那么电冰箱要同电就需要插头(socket)将插座之间连接在一起,那么它们是不是就是实现了通电,类比的想,socket就是相当于小明的主机和服务器之间的那个socket,通过socket进行数据传输,这里的数据就相当于插座提供电---提供服务。   它们之间通过socket(套接字)相互交换数据。

怎么实现Socket

其实socket并不是一个新的事物,它只是一个对ip地址和port统一在一起的抽象概念。

IP地址用于唯一标志我们自己的网络设备 ---联想生活中寄快递(发件人地址,收件人地址)

端口用于区分主机上的不同应用 (发什么快递,到哪个驿站)

我们现在讲的是建立在 C/S模式架构的---TCP连接

具体的socket实现

首先我们来看看具体的服务端(server) 以及 客户端(client)的流程图

我们使用python具体实现socket,其他的主流语言也有socket。

对于服务端server

简易版

#现在是对于sever端的具体实现
#引入套接字库
import socket 

#创建服务端函数
def server():
    #创建套接字
    s = socket.socket()
    host = "127.0.0.1" #这个为本地IP地址
    port = 6666

    #绑定套接字
    s.bind((host,port))

    #监听
    s.listen(5)

#接收&处理套接字
    while True:
        #接收报文
        c, addr = s.appect()#接收客户端的连接 返回一个socket c 以及 客户端地址
        #回传报文
        print('Connect Addr', addr)
        #关闭服务端
        c.close()

if __name__ == '__main__':
    server()

 

 客户端Client(简易版)

#客户端client 创建
import socket

def client(i):
    #创建套接字
    s = socket.socket()
    
    #连接套接字
    s.connect(('127.0.0.1',6666)) #这里连接的是服务端的套接字{ip,port}

    #recv 指定接收长度
    print("REcv mas:%s, client:%d"%(c.recv(1024),i))
    s.close()

if __name__ == '__main__':
    for i in range(10):
        client(i)

以及还有复杂版的TCP编程:基于数据流的协议,发送出的数据会按顺序,完整的接收到

要求为C/S模式

要求:服务器原封不动回传客户端发来的信息

服务器端

import socket

with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
#AF_INET 代表我们使用的是 IPv4家族
#SOCK_STREAM 代表TCP协议 流式协议

    s.bind(('0.0.0.0',1234)) 
#参数一代表主机上的任意网卡都可以使用这个socket进行通信
    s.listen() #设置为监听状态,等待客户端连接

    c, addr = s.appect() 
#接收任意客户端连接 ,返回新socket c 和 地址 建立起连接
    
    with c:
        print(addr,"Conncetted")
        
        while True:
            data = c.recv(1024) #不断接收客户传来的数据 一次最大接收量为1024字节
            if not data:
                break
            c.sendall(data) #原封不断回传客户端

客户端:

import sokcet

#使用同样的方法创建socket
with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
    s.conncet(('127.0.0.1',1234))
    s.sendall(b"HELLO,ROSS") #发送信息给服务器 
#注意:这里的参数是字节序列,不是字符串,所以前面要加上一个b

    data = s.recv(1024) #接收服务器的消息
    print("Received",repr(data))

#基本上就实现了所有操作

Tips:

1.对于这个服务器,它只能同时处理一个客户端的请求

2.with是python中的语法糖,它单纯代表当代码离开with块的时候,自动调用s.close()来销毁这个socket

最后:TCP给你报信还要等你的回话,而UDP说完话就走,不管你在不在

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值