zoukankan      html  css  js  c++  java
  • socket基础

    socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

    socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”(unix 系统出现的时候,网络协议还没有出来),对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)

    socket和file的区别:

    • file模块是针对某个指定文件进行【打开】【读写】【关闭】
    • socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】

    下面是socket 在客户端和server 端通讯的具体情况

    socket 作为“文件“来实现网络的通讯的基本情况

    运行方式: 先运行socket_server,然后运行socket-client

    实现的情况,客户端发送的一句话,服务器发送一句话

    基本的形式

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 
     4 import socket
     5 
     6 ip_port = ('127.0.0.1',9999)
     7 
     8 sk = socket.socket()
     9 sk.bind(ip_port)    ###实现到服务器上申请端口,开启服务的情况
    10 sk.listen(5)     ####最大允许链接5个
    11 
    12 while True:
    13     print('server waiting...')
    14     conn,addr = sk.accept()   ###在服务器端,开启端口后,默认是阻塞状态
    15 
    16     client_data = conn.recv(1024)    ###接收客户端的数据
    17     print(str(client_data,'utf8'))  ###打印客户端的数据
    18     conn.sendall(bytes('不要回答,不要回答,不要回答','utf8'))   ###给客户发送数据    ####socket发送和接收的过程是使用的bytes 形式
    19 
    20     conn.close()
    socket-server
     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 import socket    ######导入socket 模块
     4 ip_port = ('127.0.0.1',9999)  ##定义一个ip加端口的元组
     5 
     6 sk = socket.socket()  ###实例化一个socket
     7 sk.connect(ip_port)   ###调用上面提到的定义的元组   connect 去实现连接
     8 
     9 sk.sendall(bytes("请求占领地球",encoding='utf8'))   ###发送数据的写法   ###bytes的形式
    10 
    11 server_reply = sk.recv(1024)   ###定义一个接收到的数据的限制
    12 print(str(server_reply,'utf8'))  ###打印接收到的信息,    ###字符串的形式
    13 
    14 sk.close()    ###关闭socket
    socket-client

    二   在socket 基础上,添加功能实现了,和qq聊天类似的功能(你说一句,我说一句,继续下去)

    运行方式:先运行socket_server,然后运行socket-client,两边都有输入

    代码如下:

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 
     4 import socket
     5 
     6 ip_port = ('127.0.0.1',9999)
     7 
     8 sk = socket.socket()
     9 sk.bind(ip_port)
    10 sk.listen(5)     ####最大允许链接5个
    11 
    12 while True:
    13     print('server waiting...')
    14     conn,addr = sk.accept()
    15 
    16     client_data = conn.recv(1024)
    17     print(str(client_data,'utf8'))
    18     conn.sendall(bytes('不要回答,不要回答,不要回答','utf8'))
    19     while True:     ######用while 循环来实现输入
    20         client_data = conn.recv(1024)   ###接收client的输入
    21         print(str(client_data,'utf8'))   ###打印输入
    22         server_response = input("33[31;1m>>:33[0m").strip()  ###实现颜色的区分   ,这个需要后续再琢磨颜色的问题
    23         conn.send(bytes(server_response,'utf8'))   ###发送用户输入的内容
    24     conn.close()
    socket-server-2
     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 import socket
     4 ip_port = ('127.0.0.1',9999)
     5 
     6 sk = socket.socket()
     7 sk.connect(ip_port)
     8 
     9 sk.sendall(bytes("请求占领地球",encoding='utf8'))
    10 
    11 server_reply = sk.recv(1024)
    12 print(str(server_reply,'utf8'))
    13 
    14 while True:  ###使用循环实现 多次说话
    15     user_input = input(">>:").strip()
    16     sk.send(bytes(user_input,'utf8'))  ##发送client 端的输入
    17     server_reply = sk.recv(1024)   ##接收server 端发送的内容
    18     print(str(server_reply,'utf8'))  ##
    19 
    20 sk.close()
    socket-client-2

    三  在二的基础上,修改一下,实现了一个server 和clienta通讯,当clienta 关闭了,开启clientb 时,能在server 不关闭的情况和clientb 实现通讯

    运行方式:先运行socket_server,然后运行socket-clienta, 然后关闭clienta,开启clientb, 能实现了clientb 和server的通讯

    在代码实现的过程中,为了简化形式,只是client发送什么内容,server返回client 发送的内容

    代码如下:

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 
     4 import socket
     5 
     6 ip_port = ('127.0.0.1',9999)
     7 
     8 sk = socket.socket()
     9 sk.bind(ip_port)
    10 sk.listen(5)     ####最大允许链接5个
    11 
    12 while True:
    13     print('server waiting...')
    14     conn,addr = sk.accept()
    15 
    16     client_data = conn.recv(1024)
    17     print(str(client_data,'utf8'))
    18     conn.sendall(bytes('不要回答,不要回答,不要回答','utf8'))
    19     while True:
    20         try:
    21             client_data = conn.recv(1024)
    22             print(str(client_data,'utf8'))
    23         except Exception:    ########因为client 断开,server端程序会异常,为了让这个现象不再出现,而设置的这个异常处理
    24             print("client closed,break")
    25             break                ###只要出现任何异常,break 跳出while  执行conn.close()
    26         conn.send(client_data)
    27     conn.close()
    28 
    29 
    30 
    31 
    32 '''
    33 try:            ###抓异常的语法
    34 client_data = conn.recv(1024)
    35 print(client_data)
    36 except Exception:   ###所有的异常都处理
    37 break
    38 '''
    socket-server-3
     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 import socket
     4 ip_port = ('127.0.0.1',9999)
     5 
     6 sk = socket.socket()
     7 sk.connect(ip_port)
     8 
     9 sk.sendall(bytes("请求占领地球",encoding='utf8'))
    10 
    11 server_reply = sk.recv(1024)
    12 print(str(server_reply,'utf8'))
    13 
    14 while True:
    15     user_input = input(">>:").strip()
    16     sk.send(bytes(user_input,'utf8'))
    17     server_reply = sk.recv(1024)
    18     print(str(server_reply,'utf8'))
    19 
    20 sk.close()
    socket-client-3
  • 相关阅读:
    【日语】日语学习计划(转载)
    【日语】日语商务情景口语
    Nop常用知识点
    c#版在pc端发起微信扫码支付
    nopcommerce 常用属性验证
    @codeforces
    @codeforces
    @codeforces
    @codeforces
    @codeforces
  • 原文地址:https://www.cnblogs.com/qing-add/p/5270109.html
Copyright © 2011-2022 走看看