Python网络编程-tcp通讯

tcp通讯是面向连接的,双方需要三次握手建立连接才能发起稳定的连接

一,socket服务端

1,创建套接字
和udp创建的方式差不多,不过参数不同:

 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

2,绑定套接字
通过bind函数绑定服务端套接字的ip和端口(一般ip不指定)当客户端连接时只能通过这个端口连接
注意bind函数传入的是元祖类型参数

    socketaddr=("",7788)
    tcp_server_socket.bind(socketaddr)

3,将服务端套接字设为监听状态
这里填128

    tcp_server_socket.listen(128)

4,接收连接accept
accept方法会堵塞,直到有新的连接接入为止
并返回元祖数据,一个是此连接的socket对象,一个是ip地址和端口:

client_socket,client_addr = tcp_server_socket.accept() #用两个变量对返回的元祖数据进行拆包,第一个为链接的客户端变量的套接字对象,第二个存的是套接字的地址
    print(client_addr[0]+":"+client_addr[1])

5,接收客户端发送来的消息recv()
和udp不同的是tcp接收消息用的是recv 其中参数1024表示一次最大能接收1024byte,也就是1k,注意这个方法也会堵塞,直到收到消息为止

    recv_data = client_socket.recv(1024)
       print(recv_data.decode("gbk")) #对数据进行解码输出

6,发送数据send
注意要进行编码

  client_socket.send("hello!".encode("utf-8"))

7,关闭服务端

    tcp_server_socke他.close()

实例演示:

import socket
def main():
    #创建套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #绑定端口
    socketaddr=("",7788)
    tcp_server_socket.bind(socketaddr)
    #讲套接字设为监听状态
    tcp_server_socket.listen(128)
    #等待别的用户接入 堵塞
    client_socket,client_addr = tcp_server_socket.accept() #用两个变量对返回的元祖数据进行拆包,第一个为链接的客户端变量的套接字对象,第二个存的是套接字的地址
    print(client_addr[0]+":"+client_addr[1])
    #接收客户端发送的信息
    recv_data = client_socket.recv(1024)
    print(recv_data.decode("gbk"))
    #发送消息
    client_socket.send(recv_data)
    client_socket.close()
    tcp_server_socket.close()
if __name__ == "__main__":
    main()

二,tcp客户端

服务端需要监听客户端,调用bind方法绑定端口,调用listen方法开启监听,同时对每个连接进来的socket客户端创建socket对象,
而客户端相对于服务端就要简单的多了
1,创建socket对象

 tcp_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM

2,连接服务端connect()

  server_ip = input("请输入要链接的服务器的ip")
    server_port = int(input("请输入要链接的port"))
    server_addr = (server_ip,server_port)
    #和服务端建立链接
    tcp_client.connect(server_addr)   #注意这里接收的类型为元祖类型

3,发送消息send()

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

4,接收消息recv()
同时这个方法也会堵塞,直到连接的服务端发送消息为止

    recv_data =  tcp_client.recv(1024)
    print(recv_data.decode("gbk"))

5,关闭连接

    #关闭链接
    tcp_client.close()

注意,这里客户端没有像服务端一样调用bind的方法绑定端口,也可以进行绑定但是有时候绑定的端口被占用时就会造成程序错误,所以这里我们没有进行绑定,程序会随机选一个未被占用的端口进行连接‘
6,实例演示:

import socket

def main():
    tcp_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server_ip = input("请输入要链接的服务器的ip")
    server_port = int(input("请输入要链接的port"))
    server_addr = (server_ip,server_port)
    #和服务端建立链接
    tcp_client.connect(server_addr)   #注意这里接收的类型为元祖类型
    send_data = input("请输入要发送的数据:")
    #发送数据
    tcp_client.send(send_data.encode("utf-8"))
    #接收数据
    recv_data =  tcp_client.recv(1024)
    print(recv_data.decode("gbk"))
    #关闭链接
    tcp_client.close()

if __name__ == "__main__":
    main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值