3 socket网络编程

什么是socket

     Socket又称为套接字,它是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

客户端和服务器框架

   c/s框架:客户端(client)/服务端(server)架构

   b/s架构:浏览器(browser)/服务器(server)架构

   硬件cs框架:打印机

   软件cs框架:浏览器, qq, 微信等......

网络通信的流程

集线器:将所有电脑联通在一起

交换机:升级版本的集线器

网卡:接收处理电信号

Mac地址:物理地址: ‎68-F7-28-71-A4-9D 前三位厂商编号  后三位生产流水号,全球唯一

IP 地址: IPv4 地址: 192.168.12.16 划分广播域

ip地址段:192.168.12.0 ----192.168.12.255

ip地址段:192.168.0.0 ---- 192.168.255.255

判断是否是同一子网的方法

目标ip192.168.12.16

子网掩码:255.255.255.0

分别转换成二进制上下对齐两两配对从左到右进行''且''拼接,再转换成10进制

目标ip二进制:     11000000.10101000.00001100.00010000

子网掩码二进制: 11111111.11111111.11111111.00000000

拼接后的结果: 11000000.10101000.00001100.00000000 转换成10进制:192.168.12.0

DHCP协议:自动获取IP地址

DNS:域名解析

Arp协议:通过IP地址获取mac地址

路由器:转发消息,管理内网

路由协议:计算路由转发的最优路径

端口:表示电脑上的某个应用程序

ip + 端口 = 能够唯一锁定一台电脑和这个电脑上的某个应用程序

网关:把关用的,就是说对外的请求要经过网关

NAT技术:网络的地址转换,内网ip地址转换为公网或外网的IP地址

TCP客户端与TCP服务端的流程图

socket()模块函数用法

服务端套接字函数

bind():绑定地址(host,port) 得到套接字,在AF_INET下,以元组形式表示地址

listen():开始监听TCP,默认设置为5

accept():被动接受TCP客户端连接,等待连接的到来.

客户端套接字函数

connect():主动初识化TCP服务器连接,一般address的格式元组,如果连接出错就会放回socket.error错误

公共用途套接字函数

recv():接收TCP数据,数据以字符串形式返回

send(): 发送TCP数据,将string中的数据发送到连接的套接字

close():关闭套接字

单个客户端与服务端通信(low版)

服务端

# -*- coding:utf-8 -*-
#导入socket模块
import socket
#创建socket对象,创建一个手机
server = socket.socket()
#给程序设置一个ip地址和端口号,买一个手机卡
ip_port = ('192.168.12.35',9000)
#绑定ip地址和端口,插卡
server.bind(ip_port)
#监听ip地址和端口,简称开机
server.listen()
#等待建立连接,conn是连接通道,addr是客户端的地址
conn,addr = server.accept()
#服务端通过conn连接通道来收消息,通过recv方法,rcv里面的参数是字节(B),1024的意思1024B = 1kb
from_client_msg = conn.recv(1024)

print("客服端说:",from_client_msg.decode("utf-8"))
#回复消息,通过send方法,参数必须是字节形式的
conn.send("我是你的服务器".encode("utf-8"))
#关闭通道,关闭电话,通过close方法
conn.close()
#关闭socket对象,关机
server.close()

客户端

# -*- coding:utf-8 -*-
#导入socket
import socket
#创建一个socket对象
client = socket.socket()
#找到服务端的ip地址和端口
server_ip_port = ('192.168.12.35',9000)
#连接服务端的应用程序,通过connect方法,参数是服务端的ip地址和端口,打电话
client.connect(server_ip_port)
#发信息,用sed方法,但是调用者是client的socket对象
client.send("你好呀!".encode("utf-8"))

from_server_msg = client.recv(1024)

print('服务端说:',from_server_msg.decode("utf-8"))

client.close()

循环打印的客户端与服务端

服务端

# -*- coding:utf-8 -*-
#导入socket模块
import socket
#创建socket对象,创建一个手机
server = socket.socket()
#给程序设置一个ip地址和端口号,买一个手机卡
ip_port = ('192.168.12.35',9000)
#绑定ip地址和端口,插卡
server.bind(ip_port)
#监听ip地址和端口,简称开机
server.listen()
#等待建立连接,conn是连接通道,addr是客户端的地址
conn,addr = server.accept()
while True:
    #服务端通过conn连接通道来收消息,通过recv方法,rcv里面的参数是字节(B),1024的意思1024B = 1kb
    from_client_msg = conn.recv(1024)
    if from_client_msg.decode("utf-8").upper() == "Q":
        break
    print("客服端说:",from_client_msg.decode("utf-8"))
    to_client_msg = input('对客户端说')
    # 回复消息,通过send方法,参数必须是字节形式的
    conn.send(to_client_msg.encode("utf-8"))
    if to_client_msg.upper() == "Q":
        break

#关闭通道,关电话,通过close方法
conn.close()
#关闭socket对象,关机
server.close()

客户端

# -*- coding:utf-8 -*-
#导入socket
import socket
#创建一个socket对象
client = socket.socket()
#找到服务端的ip地址和端口
server_ip_port = ('172.18.236.104',8080)
#连接服务端的应用程序,通过connect方法,参数是服务端的ip地址和端口,打电话
client.connect(server_ip_port)
while True:
    to_server_msg = input("对服务端说:")
    # 发信息,用sed方法,但是调用者是client的socket对象
    client.send(to_server_msg.encode("utf-8"))
    if to_server_msg.upper() == "Q":
        # client.close()
        break
    from_server_msg = client.recv(1024)
    if from_server_msg.decode("utf-8").upper() == "Q":
        break

    print('服务端说:',from_server_msg.decode("utf-8"))

client.close()

   

 

posted @ 2019-02-24 15:03  等待の喵  阅读(347)  评论(0编辑  收藏  举报