서버 강좌 여섯 편으로 서버가 섰다. 이번 트랙은 반대쪽이다 — 그 서버에 붙는 코드.
붙는 코드 전부
Future<Client> connect(String step) async {
final r = await McpClient.createAndConnect(
config: McpClient.simpleConfig(
name: 'Course Client', version: '1.0.0', enableDebugLogging: false),
transportConfig: TransportConfig.stdio(
command: 'dart',
arguments: ['run', 'bin/$step.dart'],
workingDirectory: '../course-server',
),
);
return r.get();
}
config 는 우리가 누구인지, transportConfig 는 어떻게 가 닿는지다.
전송이 명령이다
TransportConfig.stdio 의 인자를 봐 달라. 호스트도 포트도 없다. command 와 arguments 다.
클라이언트가 서버 프로세스를 직접 띄우고, 그 프로세스의 stdin/stdout 으로 말한다. 설정할 소켓이 없고, 뜰 때까지 기다릴 서비스가 없다.
이게 사소해 보이는데, 나중에 값을 한다. 전송을 바꾸는 일이 어느 프로그램을 띄우느냐 로 줄어들기 때문이다.
// 시리얼 장치로
command: '../serial_bridge/serial_bridge',
arguments: ['/dev/cu.usbmodem1234', '115200'],
// 네트워크 장치로
command: '../tcp_bridge/tcp_bridge',
arguments: ['mcp-esp32.local', '6270'],
클라이언트 코드는 한 글자도 안 바뀐다. 실보드 편에서 STM32 와 ESP32 에 같은 코드로 붙을 수 있었던 게 이 구조 때문이다.