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()