首页 > 其他 > 详细

socket通信基本使用

时间:2020-04-02 15:42:49      阅读:64      评论:0      收藏:0      [点我收藏+]

socket通信基于tcp和udp

TCP和UDP的区别:

1.TCP是面向连接的,UDP是无连接的,TCP提供可靠的服务,也就是说,通过TCP连接传输的数据不会丢失,没有重复,并且按顺序到达,UDP没有可靠性。

2、TCP是面向字节流的,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的。TCP是全双工的可靠信道,UDP是不可靠信道。

 

基于tcp的socket服务端

# 1.首先引用socket库 2.创建socket套字节对象 3.绑定ip和端口 4.监听来自客户端的连接,可设置连最大连接数 5.接收来自客户端连接 6.接收消息及回复(发送)消息

import socket
# socket.AF_INET 基于网络 ,socket.SOCK_STREAM 以字节流的方式
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 重用地址
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定ip和端口
s.bind((127.0.0.1, 8000))
# 监听连接
s.listen(5)
print("服务端启动...")
# 接收连接,返回元组
conn, addr = s.accept()
# 主动发消息给客户端,调用send()方法,将字符串转成字节流发送给客户端
conn.send("来自服务端的问候".encode(utf-8))
print("conn: %s addr: %s" %(conn, addr))
try:
    while True:
        # 调用recv的方法接收客户端的消息,每次1024字节的接收
        msg = conn.recv(1024)
        if msg:
            # 接收到的消息是字节流,需要解码成字符串对象
            print("收到来自客户端的消息: %s" % msg.decode(utf-8))
        # input 用户输入
        to_msg = input("请输入要发送给客户端的消息: ")
        if to_msg:
       # 回复 conn.send(to_msg.encode(
utf-8)) else: pass except Exception: print("error") finally: # 关闭客户端连接 conn.close() # 关闭服务端 s.close()

 

基于tcp的socket客户端

import socket
# 创建socket对象
c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# c.connect((‘127.0.0.1‘, 8000))
# 与服务端建立连接, 参数地址,端口,传入一个元组
c.connect((‘127.0.0.1, 8888))
print("客户端启动...")
while True:
    # 用户输入
    msg = input("请输入要发送给服务端的消息: >>>")
    if msg:
        # 发消息给客户端
        c.send(msg.encode(utf-8))
    else:
        print("抱歉您未输入任何信息!")
        msg = input("请输入要发送给服务端的信息: >>>")
    rec_msg = c.recv(1024)
    if rec_msg:
        print("收到来自服务端的消息: %s" % rec_msg.decode(utf-8))
    else:
        break
# 关闭连接
c.close()

socket是单线程,socket服务端接收一个客户端请求,其他客户端请求进入等待。listen()限制最大接收的请求数量。

收发消息时: 硬盘->以字节流的方式读入内存缓冲区->通过网络拷贝到接收方的内存缓冲区->写入接收方硬盘->清空内存缓冲区

 

基于udp的socket服务端

# udp服务端 无连接
from socket import *
ip_port = (127.0.0.1, 8000)
rec_size = 1024
# 创建一个udp套字节对象, AF_INET基于网络,SOCK_DGRAM 数据报的方式
s_udp = socket(AF_INET, SOCK_DGRAM)
# 绑定ip和端口
s_udp.bind(ip_port)
print("服务端开始服务中....")
while True:
    # 接收客户端的消息和地址
    data, address = s_udp.recvfrom(rec_size)
    print("收到来自客户端< %s,%s >的消息" % address, data.decode(utf-8))
    # 发送给客户端消息
    s_udp.sendto(data.upper(), address)

基于udp的socket客户端

#udp 客户端
from socket import *
rec_size = 1024
ip_port = (127.0.0.1, 8000)
# 创建udp套字节对象
c_udp = socket(AF_INET, SOCK_DGRAM)
while True:
    try:
        msg = input("发送给服务端的消息: >>> ").strip()
        if not msg: continue
        # 给服务端发送消息
        c_udp.sendto(msg.encode(utf-8), ip_port)
        # 接收服务端的消息
        data, address =c_udp.recvfrom(rec_size)
        print("收到来自服务端的消息:", data.decode(utf-8))
    except Exception:
        continue

 

socket通信基本使用

原文:https://www.cnblogs.com/kral-yang/p/12620221.html

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