Socket网络编程(二)
使用TCP完成通信
对于TCP server端的创建而言,分为如下几个步骤:
1.创建socket对象(socket):其中两个参数分别为Address Family(如AF_INET为IPV4,AF_INET6为IPV6,AF_UNIX为UNIX域协议族)、socket类型(如SOCK_STREAM为TCP,SOCK_DGRAM为UDP)。
2.绑定服务器地址(bind):参数为服务器地址二元组。
3.监听(listen):参数为允许的连接数。
4.等待请求(accept)。
5.接收数据(recv、recvfrom、recvfrom_into、recv_into)、发送数据(send、sendall、sendto)。
6.关闭连接(close)。
服务器:
from socket import *
def tcp_server():
'''创建套接字'''
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
'''绑定本地信息'''
tcp_server_socket.bind(('', 8888))
'''将默认套接字设置为被动listen'''
tcp_server_socket.listen(128)
while True:
'''等待客户端连接'''
print("等待客户端连接........")
new_client_socket, client_addr = tcp_server_socket.accept()
print("客户来了:%s" % str(client_addr))
while True:
'''接收客户端信息'''
recv_data = new_client_socket.recv(1024).decode('utf-8')
print(recv_data)
if recv_data:
'''回送信息给客户端'''
new_client_socket.send('收到请回复'.encode('utf-8'))
else:
break
print("服务结束,下一个.......\n\n")
'''关闭套接字'''
new_client_socket.close()
tcp_server_socket.close()
if __name__ == '__main__':
tcp_server()
bind()第一个参数留空,为任意ip,第二个参数为端口号
listen()设置服务器为被动监听
对于TCP client端的创建而言,分为如下几个步骤:
1.创建套接字
2.连接服务器
3.send发送消息
4.关闭套接字
客户端:
from socket import *
def tcp_client():
"""创建套接字"""
tcp_client_socket = socket(AF_INET, SOCK_STREAM)
"""ip和端口"""
tcp_addr = input("请输入连接的服务器IP:")
tcp_port = int(input("请输入连接的服务器PORT:"))
'''连接服务器'''
tcp_client_socket.connect((tcp_addr, tcp_port))
while True:
'''发送/接收数据'''
send_data = input("输入发送的信息:")
tcp_client_socket.send(send_data.encode('utf-8'))
if send_data == 'EXIT':
break
'''关闭套接字'''
tcp_client_socket.close()
if __name__ == '__main__':
tcp_client()
recv()在未接受消息时默认堵塞,同UDP。
TCP粘包分析:
在传送数据时,不知道对方是否发送完数据,即没有限制字节数,导致粘包问题。