python socket 网络编程的基本功
python socket逻辑思维整理
UDP发送步骤:
1 、先建立udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
2、利用sendto把数据并指定对端IP和端口,本端端口可以不用指定用自动随机的
udp_socket.sendto(“发送的内容”.encode(“utf-8”), (“192.168.2.121”, 8080))
3、关闭套接字
udp_socket.clise()
UDP接收步骤:
1 、先建立udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
2、绑定本机IP和端口
udp_socket.bind((“192.168.2.121”, 8080))
3、接收数据
recv_data = udp_socket.recvfrom(1024)
4、接收到的是两个数据分开打印出来
recv_message = recv_data[0]
recv_ip_port = recv_data[1]
print(“%s:%s” %(str(recv_ip_port), recv_message.decode(“gbk”)))
5、关闭套接字
udp_socket.clise()
TCP发送步骤:
1、建立套接字
send_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2、指定服务器的IP和端口并连接服务器
send_socket.connect((“192.168.2.121”, 8081))
3、发送数据
send_socket.send(“发送内容”.encode(‘gbk’))
4、关闭套接字
send_socket.close()
TCP接收步骤
1、建立套接字
send_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2、绑定IP和端口
server_socket.bind((“192.168.2.121”, 8081))
3、监听端口
server_socket.listen(128)
4、接收客户端的到来,生成两个结果值:
一个新的套接字new_client和客户端的ip+端口
new_client, address_port = server_socket.accept()
5、用新的套接字接收数据
recv_data = new_client.recv(1024).decode(‘gbk’)
6、关闭新套接字
new_client.close()
7、关闭全局套接字
send_socket.close()
具体代码案例:
UDP发送端:
import socketdef main():udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)while True:print("---------------input 'quit/exit' out process!-------------")print("-----------------------------------------------------------")send_result = input("please input result: ").strip()if send_result == "exit":breakelif send_result == "quit":breakudp_socket.sendto(send_result.encode("utf-8"), ("192.168.2.121", 8080)) udp_socket.close()if __name__ == "__main__":main()
UDP接收端:
import socketdef main():#创建套接字udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)#设置ip和端口ip_port = ("192.168.2.121", 8080)#绑定商品和IPudp_socket.bind(ip_port)#接收数据while True:recv_data = udp_socket.recvfrom(1024)recv_message = recv_data[0]recv_ip_port = recv_data[1]#打印数据print("%s:%s" %(str(recv_ip_port), recv_message.decode("gbk")))#关闭套接字 udp_socket.close()if __name__ == "__main__":main()
UDP发送和接收端:
import socketdef send_data(udp_socket, send_ip, send_port):#发送数据send_result = input("please input result: ").strip() udp_socket.sendto(send_result.encode("gbk"), (send_ip, int(send_port)))def recv_datas(udp_socket):#接收数据recv_data = udp_socket.recvfrom(1024)print("%s:%s===>%s" %(str(recv_data[1][0]), str(recv_data[1][1]),recv_data[0].decode('gbk')))def main():udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)udp_socket.bind(("192.168.2.121", 8082)) send_ip = input('please input ip address: ').strip()send_port = input('please input port: ').strip()while True:print("---------------chat-------------")print("---1:发送---2:接收---3:退出---")option = input("please your select: ").strip() if option == "1":send_data(udp_socket, send_ip, send_port)elif option == "2":recv_datas(udp_socket)elif option == "3":breakelse:print("you input errer!")continueudp_socket.close() if __name__ == "__main__":main()
TCP发送端:
import socketdef main():#建立套接字send_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#指定服务器的IP和端口address = input('ip address: ').strip()ports = int(input('port: ').strip())#连接服务器send_socket.connect((address, ports))#发送数据send_data = input("input mes: ").strip()send_socket.send(send_data.encode('gbk'))#recv_data = send_socket.recv(1024)#print(recv_data)#关闭套接字send_socket.close()if __name__ == "__main__":main()
TCP接收和发送端(带系统命令操作参数返回):
import socket,subprocessdef main():#建立套接字,tcp这个里面的套接字变量只用于绑定和监听server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#绑定IP和端口server_socket.bind(("192.168.2.121", 8081))#监听端口server_socket.listen(128)while True:print('========等待连接==========')#接到到客户端连接后生成一个新的套接字,并接收到客户端的ip和端口address_portnew_client, address_port = server_socket.accept()#程度运行后就一直处于accept阻塞等着客户端来连接#有客户端连接上来了就打印出来连接的客户端ip和端口print('=========客户端已连接上==========') print(address_port)#一直阻塞等客户端发数据过来while True:recv_data = new_client.recv(1024).decode('gbk')#print(recv_data.decode('gbk')) #只要有客户端数据发来,就马上回过去,这步不阻塞 if not recv_data: # 客户在离开时没有数据过来就认为关闭了break#接收客户端发来的内容转为指令result = subprocess.getoutput(recv_data)#把指令在本地执行的内容再返还给客户端,如ipconfig,把查到的ip信息返回new_client.send(result.encode('gbk'))#关闭套接字new_client.close()server_socket.close()if __name__ == "__main__":main()