返回顶部

day29 socket

 

 

socket

 

 

socket 通信简单述说

网络通信的步骤
1)确定对端的ip地址
2)确定应用程序的端口
3)确定通信协议

网络通信的过程其实就是一个(源端)不断封装数据包和(目的端)不断拆包的过程

socket编程   tcp  udp 协议:
tcp/ip 即传输控制协议/网间协议 定义了主机如何连接到internet 及数据如何在它们之间传输的标准
tcp/ip协议是指因特网整个tcp/ip协议簇, 不同于ios7层模型, tcp/ip协议参考模型把所有的tcp/ip协议归类到四个抽象层中: 应用层(TFTP  HTTP SNMP FTP SMTP DNS Telent)    传输层(tcp  udp) 网络层(IP IGMP ICMP)  数据链路层
上层建立在下层服务上,下层为上层提供服务

我们利用ip地址+协议+端口号唯一标识: 网络中一个进程。能够唯一标识网络中的一个进程后,它们就能通过socket通信了
我们把socket翻译为套接字
socket是应用层 与传输层(tcp/ip协议簇通信)的一个抽象层,是一组接口,它把tcp/ip复杂的操作抽象为几个简单的接口供应用层调用,实现进程间的网络通信
应用程序两端通过套接字向网络发出请求  或应答网络请求  可以把socket理解为网络把手(hand)
socket 起源于 Unix, 在Unix一切皆文件哲学思想下 socket是打开--读/写--关闭模式的实现
服务器和客户端维护一个文件,在建立连接打开后可以向自己文件写入内容,供对象的读取或读取对方的文件内容,通信结束后关闭文件

 

 

流程描述

1) 服务端根据地址类型(ipv4 ipv6)socket类型协议创建socket

2)服务端为socket绑定ip+端口

3)服务端监听端口请求随时接收客户端发来的连接,这时服务端的socket没有被打开。

4) 客户端创建socket

5)客户端创建socket 根据服务端ip地址和端口号连接服务器的socket

6) 服务端的socket接收客户端的socket请求,被动打开,开始接收客户端的请求,直到客户端返回连接信息,这时socket进入阻塞状态,阻塞就是accept() 方法,一直等到客户端返回连接信息后才返回,开始接收下个客户端请求

7)客户端连接成功后 向服务端发送连接状态信息

8)服务端accept方法返回 连接成功

9)客户端向socet 写入信息(或服务端向客户端写入信息)

10)服务端(客户端)读取信息

11) 客户端关闭

12) 服务端关闭

 

 

 

简单的

import socket
ip_addr = ("127.0.0.1",6666)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(ip_addr)
s.send("kehuduan".encode("utf-8"))
data = s.recv(1024)
print(data.decode("utf-8"))
socket_client

 

import socket
ip_addr = ("127.0.0.1",6666)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind (ip_addr)
s.listen(5)
conn,addr = s.accept()
msg = conn.recv(1024)
print("----->",msg)
conn.send("server".encode("utf-8"))
conn.close()
s.close()
python_server

 

简单的web

#!/usr/bin/env python
#encoding:utf-8


import socket
ip_addr = ("192.168.2.22",8083)

def hand_request(client):
    buf = client.recv(1024)
    client.send("HTTP/1.1 200 OK\r\n\r\n".encode("utf-8"))
    client.send("yslysl".encode("utf-8"))

def main():
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.bind(ip_addr)
    s.listen(5)

    while True:
        conn,addr = s.accept()
        hand_request(conn)
        conn.close()
main()
web

 

模拟10086

import socket

ip_addr = ("127.0.0.1",8888)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(ip_addr)

while True:
    data = s.recv(1024)
    print(data.decode("utf-8"))
    inp = input("please input>>>>>  ").strip()
    s.send(inp.encode("utf-8"))
    if inp == "exit":break
s.close()
client

 

import socket

ip_addr = ("127.0.0.1",8888)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(ip_addr)
s.listen(5)

while True:
    conn,addr = s.accept()
    conn.send("欢迎致电10086".encode("utf-8"))
    Flag = True
    while Flag:
        data = conn.recv(1024).strip()
        print(data)
        if data == "exit".encode("utf-8"):
            Flag = False
        elif data == "0".encode("utf-8"):
            conn.send("可能被录音".encode("utf-8"))
        else:
            conn.send("重新输入".encode("utf-8"))
    conn.close()
server

 

posted on 2018-08-24 16:54  augustyang  阅读(245)  评论(0编辑  收藏  举报

导航