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