python中TCP套接字:

1.简介

(TCP)传输控制协议,面向连接。是一种提供可靠数据传输的通用协议。分为客户端和服务器端。

  • 传输层协议

  • 有连接

  • 可靠传输

  • 面向字节流

基于 TCP 的套接字编程的所有客户端和服务器端都是从调用socket 开始,它返回一个套接字描述符。客户端随后调用connect 函数,服务器端则调用 bind、listen 和accept 函数。


2.函数介绍

connect函数:TCP在处理面向连接的网络服务时 ,交换数据之前必须在请求的进程套接字和提供服务的进程套接字之间建立连接。TCP 客户端可以调用函数connect 来建立与 TCP 服务器端的一个连接。若 TCP 套接字调用connect 函数将建立 TCP 连接(执行三次握手)。

bind函数:调用函数 socket 创建套接字描述符时,该套接字描述符是存储在它的协议族空间中,没有具体的地址,要使它与一个地址相关联,可以调用函数bind 使其与地址绑定。客户端的套接字关联的地址一般可由系统默认分配,因此不需要指定具体的地址。若要为服务器端套接字绑定地址,可以通过调用函数 bind 将套接字绑定到一个地址。

listen函数:在编写服务器程序时需要使用监听函数 listen 。服务器进程不知道要与谁连接,因此,它不会主动地要求与某个进程连接,只是一直监听是否有其他客户进程与之连接,然后响应该连接请求,并对它做出处理,一个服务进程可以同时处理多个客户进程的连接。

accept 函数:由 TCP 服务器调用,用于从已完成连接队列队头返回下一个已完成连接。如果已完成连接队列为空,那么进程被投入睡眠。该函数的返回值是一个新的套接字(元组)描述符,返回值是表示已连接的套接字描述符,而第一个参数是服务器监听套接字描述符。一个服务器通常仅仅创建一个监听套接字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建一个已连接套接字(表示 TCP 三次握手已完成),当服务器完成对某个给定客户的服务时,相应的已连接套接字就会被关闭。


3.客户端代码的实现 

import socket

def main():
    # 创建socket,TCP固定为(socket.AF_INET,socket.SOCK_STREAM)
    tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    # 连接服务器  参数是一个元组(服务器IP,端口号)
    tcp_socket.connect(("192.168.0.105", 8081))

    # 发送数据
    send_data = input("请输入发送的数据:")
    tcp_socket.send(send_data.encode("utf-8"))

    # 接收数据
    recv_data = tcp_socket.recv(1024)
    print('接收的数据为:', recv_data.decode("utf-8"))

    # 关闭socket
    tcp_socket.close()

if __name__ == '__main__':
        main()

4.服务端的实现

import socket

def main():
    # 1.创建套接字,只用来监听使用的套接字
    tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 2.绑定ip元祖
    tcp_socket.bind(("",8085))
    # 3.准备好监听客户端
    tcp_socket.listen(128 )
    while True:
        # 4.等待客户端,new_client_socket新创建的套接字,与客户端交流使用
        print("等等待新的客户端链接。。。。。。")
        new_client_socket,client_addr = tcp_socket.accept()
        print("链接的客户端是:",client_addr)
        while True:
            # 5.打印接收的信息
            recv_data = new_client_socket.recv(1024)
            if recv_data:
                print('接收的数据为:', recv_data.decode("GBK"))
                new_client_socket.send("回复的诗句信息".encode("GBK"))
                print('回复的数据为:回复的诗句信息')
            else:
                break
        new_client_socket.close()
    tcp_socket.close()

if __name__ == "__main__":
    main()

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值