| package com.pt.controller; |
| |
| import com.pt.service.TrackerService; |
| import jakarta.servlet.http.HttpServletRequest; |
| import jakarta.servlet.http.HttpServletResponse; |
| import org.springframework.beans.factory.annotation.Autowired; |
| import org.springframework.web.bind.annotation.*; |
| |
| import java.io.IOException; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| @RestController |
| @RequestMapping("/api/tracker") |
| @CrossOrigin(origins = "*") |
| public class TrackerController { |
| |
| @Autowired |
| private TrackerService trackerService; |
| |
| // tracker相应bt客户端的announce请求 |
| @PostMapping("/announce") |
| public void announceByPost( |
| @RequestBody Map<String, String> body, |
| HttpServletRequest request, |
| HttpServletResponse response |
| ) throws IOException { |
| try { |
| |
| String infoHash = body.get("info_hash"); |
| String peerId = body.get("peer_id"); |
| int port = Integer.parseInt(body.get("port")); |
| |
| String ip = request.getRemoteAddr(); |
| |
| // 将参数封装为 Map 传给服务层(也可以直接传对象) |
| Map<String, String[]> params = new HashMap<>(); |
| params.put("info_hash", new String[]{infoHash}); |
| params.put("peer_id", new String[]{peerId}); |
| params.put("port", new String[]{String.valueOf(port)}); |
| byte[] bencodedResponse = trackerService.handleAnnounce(params, ip); |
| |
| response.setContentType("application/x-bittorrent"); |
| response.getOutputStream().write(bencodedResponse); |
| } catch (Exception e) { |
| response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); |
| response.setContentType("text/plain"); |
| response.getWriter().write("Tracker internal error: " + e.getMessage()); |
| } |
| } |
| |
| } |
| |