首页 > 其他 > 详细

Socket编程一

时间:2020-04-12 15:01:36      阅读:73      评论:0      收藏:0      [点我收藏+]

前言:Socket编程是属于网络编程,那么需要先知道网络七层模型

  网络七层模型分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

  Socket是属于对传输层进行编程。

  传输层:传输层向高层提供可靠的端到端的网络数据流服务。每一个应用程序都会在网卡注册一个端口号,该层就是端口与端口的通信!常用的(TCP/IP/UDP)

  TCP/UDP的区别:

    TCP和UDP很相似,但区别在于:UDP不提供数据包分组、组装、排序,无法保证接收者能否正确接收数据

    TCP是面向连接,进行三次握手建立连接和四次挥手断开连接,UDP是不面向连接

    TCP是可靠的、UDP不可靠

  应用场景:TCP用于大的数据传输,如http协议

       UDP是用于小的数据传输,如DNS协议

Socket通信原理:

  实现套接字,通过套接字允许程序接受并进行连接,为了建立通信,网络通信的每个端点拥有一个套接字对象极为重要

套接字类型:

  TCP套接字:需要指定套接字类型 SOCK_STRAM

  UDP套接字:需要指定套接字类型 SOCK_DGRAM

 

实例1:创建TCP的服务端和客户端代码

# 服务端
# encoding=utf-8
import sys
import socket

ip_port = (127.0.0.1, 9999) 
sk = socket.socket()  # 创建句柄
sk.bind(ip_port)  # 绑定端口
sk.listen(5)  # 监听(最多连接数)
# 注意如果这里没有客户端连接进来,那么会处于一个阻塞的状态
conn, addr = sk.accept()  # conn是客户端对象, addr是客户端ip地址
print(conn)
print(addr)
client_data = conn.recv(1024)  # 获取客户端的数据
print(client_data.decode(utf-8))

conn.send(服务端回复的内容.encode(utf-8))  # 向客户端发送数据
conn.close()  # 关闭
# 客户端
#encoding=utf-8
import socket

ip_port = (127.0.0.1, 9999)
sk = socket.socket()  # 创建句柄
sk.connect(ip_port)  # 和服务器建立连接
sk.send(客户端发送的数据.encode(utf-8))  # 向服务器发送数据
server_reply = sk.recv(1024)  # 获取服务器返回的数据
print(server_reply.decode(utf-8))
sk.close()  # 和服务器关闭连接

# 执行结果:

服务端执行结果:

技术分享图片

 

 

 客户端执行结果:

技术分享图片

 

 

 

实例2:创建UDP的服务端和客户端代码#服务端from socket import *

from time import ctime

HOST = ‘‘  # 空就默认是本地IP
PORT = 1200
ADDR = (HOST, PORT)

udpServer = socket(AF_INET, SOCK_DGRAM)  # # 创建一个服务器端UDP套接字
udpServer.bind(ADDR)  # 绑定服务器套接字

#如果没有客户端连接进来,那么服务端会处于阻塞状态
data, addr = udpServer.recvfrom(1024) # 接收来自客户端的数据 print("得到客户端数据:",data.decode("utf-8")) udpServer.sendto(b%s %s[%s] % ("服务器发送消息:".encode("utf-8"),ctime().encode("utf-8"),data),addr) # 向客户端发送数据 udpServer.close()
# 客户端
#encoding=utf-8
from socket import *

HOST = localhost
PORT = 1200
ADDR = (HOST, PORT)

udpClient = socket(AF_INET, SOCK_DGRAM)   # 创建客户端UDP套接字
data = input(>)
udpClient.sendto(data.encode("utf-8"), ADDR)  # 向服务器端发送数据

data, ADDR = udpClient.recvfrom(1024)  # 接收来自服务器端的数据
print(data.decode("utf-8"))
udpClient.close()

执行结果:

服务端:

技术分享图片

 

 

 客户端:

技术分享图片

 

Socket编程一

原文:https://www.cnblogs.com/su-sir/p/12685211.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!