首页 > 编程语言 >网络编程之基于TCP协议的socket套接字编程

网络编程之基于TCP协议的socket套接字编程

时间:2024-01-16 21:15:12浏览次数:32  
标签:socket 编程 TCP server client send msg conn

基于TCP的套接字

【1】方法简介

  • tcp是基于链接的
    • 必须先启动服务端
    • 然后再启动客户端去链接服务端
  • tcp服务端
server = socket() #创建服务器套接字
server.bind()      #把地址绑定到套接字
server.listen()      #监听链接
inf_loop:      #服务器无限循环
    conn = server.accept() #接受客户端链接
    comm_loop:         #通讯循环
        conn.recv()/conn.send() #对话(接收与发送)
    conn.close()    #关闭客户端套接字
server.close()        #关闭服务器套接字(可选)
  • tcp客户端
client = socket()    # 创建客户套接字
client.connect()    # 尝试连接服务器
comm_loop:        # 通讯循环
    client.send()/client.recv()    # 对话(发送/接收)
client.close()            # 关闭客户套接字

【2】打电话模型

【1.0】基础版

  • 服务端
# 先写服务端
# 打电话

import socket

# 【1】先有电话
server = socket.socket()

# 【2】电话要插卡
# ('ip','port')
IP = '127.0.0.1'  # 本地的回环地址 / localhost
PORT = 8080
server.bind((IP, PORT))

# 【3】可能会接受到别人的电话
# 半连接池 :
server.listen(5)

# 【4】接电话
conn, addr = server.accept()
# print(f'conn :>>>> {conn}')
# print(f'addr :>>>> {addr}')
# # conn :>>>> <socket.socket fd=352, family=2, type=1, proto=0, laddr=('127.0.0.1', 8080), raddr=('127.0.0.1', 50851)>
# # addr :>>>> ('127.0.0.1', 50851)

# 【5】接受消息
# 参数 : 接收到的数据的大小
from_to_client_msg = conn.recv(1024)
from_to_client_msg = from_to_client_msg.decode('utf-8')
print(f'from_to_client_msg :>>>> {from_to_client_msg}')

# 【6】回复消息
# 传输的数据是二进制格式的数据
# send_msg = b'你好'
send_to_client_msg = '你好'
send_to_client_msg = send_to_client_msg.encode('utf-8')
conn.send(send_to_client_msg)

# 【7】挂断电话
conn.close()

# 【8】手机关机
server.close()
  • 客户端
import socket

# 【1】有一部手机
client = socket.socket()

# 【2】接电话,知道别人的电话号
IP = '127.0.0.1'
PORT = 8080
client.connect((IP, PORT))

# 【3】发送消息
send_to_server_msg = f'我是客户端'
send_to_server_msg = send_to_server_msg.encode('utf-8')
client.send(send_to_server_msg)

# 【4】接受消息
from_server_msg = client.recv(1024)
# 二进制数据解码
from_server_msg = from_server_msg.decode('utf-8')
print(f'from_server_msg :>>>> {from_server_msg}')

# 【5】挂电话
client.close()

基础版模版

############ 服务端
# 导入模块
from socket import socket

# 创建socket对象
server = socket()
# 监听端口
IP = '127.0.0.1'
PORT = 9080
server.bind((IP, PORT))
# 监听连接对象个数
server.listen(5)
# 创建连接对象
conn, addr = server.accept()
# 通过连接对象接收数据 1kb = 1024 bytes
from_client_lsg = conn.recv(1024)
from_client_lsg = from_client_lsg.decode('utf8')
print(from_client_lsg)
# 回数据
send_to_client_msg = '我是服务端'
send_to_client_msg = send_to_client_msg.encode('utf8')
conn.send(send_to_client_msg)
# 关闭链接
conn.close()
# 关闭连接
server.close()

############ 客户端
from socket import socket
# 创建客户端对象
client = socket()
# 监听连接
# 监听端口
IP = '127.0.0.1'
PORT = 9080
client.connect((IP, PORT))
# 发送
send_to_server_msg = '我是客户端'
send_to_server_msg = send_to_server_msg.encode('utf8')
client.send(send_to_server_msg)
# 接收
from_server_msg = client.recv(1024)
from_server_msg = from_server_msg.decode('utf8')
print(from_server_msg)
# 关闭链接
client.close()

【2.0】循环版

  • server
# 先写服务端
# 打电话

import socket

# 【1】先有电话
server = socket.socket()

# 【2】电话要插卡
# ('ip','port')
IP = '127.0.0.1'  # 本地的回环地址 / localhost
PORT = 8060
server.bind((IP, PORT))

# 【3】可能会接受到别人的电话
# 半连接池 :
server.listen(5) # 限制客户端数量

while True:
    # 【4】接电话
    conn, addr = server.accept()

    # 【5】接受消息
    from_to_client_msg = conn.recv(1024)
    from_to_client_msg = from_to_client_msg.decode('utf-8')
    print(f'from_to_client_msg :>>>> {from_to_client_msg}')

    # 【6】回复消息
    # 传输的数据是二进制格式的数据
    # send_msg = b'你好'
    while True:
        send_to_client_msg = input("请输入需要发送的消息 :>>>> ").strip()
        if not send_to_client_msg:
            print(f'当前不能为空!请重新输入!')
            continue
        send_to_client_msg = send_to_client_msg.encode('utf-8')
        conn.send(send_to_client_msg)
        break
# 【7】挂断电话
conn.close()

# 【8】手机关机
server.close()
  • client
import socket

while True:
    # 【1】有一部手机
    client = socket.socket()

    # 【2】接电话,知道别人的电话号
    IP = '127.0.0.1'
    PORT = 8060
    client.connect((IP, PORT))
    # 【3】发送消息 --- 发送的消息不能为空
    send_to_server_msg = input("请输入发送的消息 :>>>> ").strip()
    if not send_to_server_msg:
        print(f'当前不能为空!请重新输入!')
        continue
    send_to_server_msg = send_to_server_msg.encode('utf-8')
    client.send(send_to_server_msg)

    # 【4】接受消息
    from_server_msg = client.recv(1024)
    # 二进制数据解码
    from_server_msg = from_server_msg.decode('utf-8')
    print(f'from_server_msg :>>>> {from_server_msg}')

    # 【5】挂电话
client.close()

循环版模版

############ 客户端
# 创建对象
from socket import socket

while True:
    client = socket()

    # 创键连接
    client.connect(('127.0.0.1', 9696))

    # 发送消息
    send_msg = input("请输入消息 :>>>> ").strip()
    if not send_msg: continue
    client.send(send_msg.encode('utf-8'))
    if send_msg == 'q':
        client.close()
        break
    # 接收消息
    msg = client.recv(1024)
    print(msg.decode('utf8'))

############ 服务端
from socket import socket

server = socket()

server.bind(('127.0.0.1', 9696))

server.listen(5)

while True:
    conn, addr = server.accept()
    # 先接受
    msg = conn.recv(1024)
    msg = msg.decode('utf8')
    print(f'msg:>>>{msg}')
    if msg == 'q':
        conn.close()
        break
    # 再发送
    while True:
        send_msg = input("发送的消息 :>>>> ").strip()
        if not send_msg: continue
        conn.send(send_msg.encode('utf8'))
        break
server.close()

空数据的处理

  • TCP协议是水流式协议:传入的数据不能为空,因为水是一直流的,在传输过程中不会对数据进行操作
  • UDP协议是数据报协议:传入的数据可为空,在传输过程中UDP会对数据进行内部的拼接和处理

断开链接的影响

  • TCP协议是水流式协议:在建立链接过程中,服务端和客户端的链接是一直存在的,断开一方都会对另一方造成影响
  • UDP协议是数据报协议:在建立链接过程中,是通过解析对方数据中的ip和端口,再向另一方返回数据的,所以一方发生问题并不会影响到另一方

标签:socket,编程,TCP,server,client,send,msg,conn
From: https://www.cnblogs.com/xiao01/p/17968529

相关文章

  • 网络编程之Socket抽象层
    Socket介绍假设我们需要编写一个C/S架构的程序,实现数据交互,就需要使用到OSI七层协议,由于它的缺点是分层太多,增加了网络工作的复杂性,所以没有大规模应用。后来人们对OSI进行了简化,合并了一些层,最终只保留了4层,从下到上分别是接口层、网络层、传输层和应用层,这就是TCP/IP模......
  • 网络编程之基于UDP协议的socket套接字编程
    基于UDP的套接字udp是无链接的,先启动哪一端都不会报错【1】方法简介(1)UDP服务端server=socket()#创建一个服务器的套接字server.bind()#绑定服务器套接字inf_loop:#服务器无限循环conn=server.recvfrom()/conn.sendto()#对话(接收与发送)serv......
  • 网络编程之粘包问题
    粘包问题只有TCP有粘包现象,UDP永远不会粘包什么是粘包存在于客户端接收数据时,不能一次性收取全部缓冲区中的数据.当下一次再有数据来时,缓冲区中剩余的数据会和新的数据'粘连'在一起.这就是粘包现象。##什么是粘包?存在于TCP/IP协议中数据粘连在一起。##socket中造成粘......
  • 网络编程之网络架构及其趋势
    一、网络结构模型C/S和B/S都是互联网中常见的网络结构模型。引言刚开始的时候用户去取数据,直接就去主机拿,从这里开始就分出了客户端和服务端。客户端:用户安装的软件;服务端:统一管理数据库的主机中的软件就叫做服务端,再后来服务端不只是管理数据,外加处理业务逻辑。1.1什么......
  • 网络编程TCP UDP
    网络编程(1)什么是网络编程网络编程是指通过编程语言在计算机之间建立通信的一种方式。它是在互联网上进行数据传输的关键组成部分,使计算机能够相互通信、交换信息和共享资源。网络编程涉及许多不同的技术和协议,包括TCP/IP(传输控制协议/因特网协议),HTTP(超文本传输协议),FTP(文件传......
  • socket模块
    socket(1)scoket层在哪(2)什么是socketSocket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。所......
  • springBoot通过AOP(面向切面编程)实现自动保存请求日志
    1.定义注解importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;@Target(ElementType.METHOD)//指定该注解只能应用于方法上@Retention(RetentionPolicy.......
  • 【6.0】socketserver实现并发
    【一】引入socket并不能多并发,只能支持一个用户socketserver模块是Python中用于创建网络服务器的模块,提供了一种简单而一致的接口。它是构建网络服务器的框架,处理了创建、维护和关闭连接的许多底层细节socketserver是socket的再封装。【二】socketserver介绍【1】简......
  • 网络编程
    【一】CS架构与BS架构C/S和B/S都是互联网中常见的网络结构模型。【1】什么是C/S模型C是英文单词“Client”的首字母,即客户端的意思C/S就是“Client/Server”的缩写,即“客户端/服务器”模式。例如:拼多多APP、PC上的有道云笔记等等【2】什么是B/S模型B是英文单词“B......
  • 【python网络编程相关】 ----操作系统相关了解
    title:【python网络编程相关】----操作系统相关了解date:2024-01-1615:54:06updated:2024-01-1616:20:00description:【python网络编程相关】----操作系统相关了解cover: https://www.cnblogs.com/YZL2333/p/10444200.htmlhttps://home.cnblogs.com/u/......