English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Erlang에서 포트는 다른 프로그램 간의 통신에 사용됩니다. 소켓은 통신 단점으로, 컴퓨터가 인터넷 프로토콜(IP)을 통해 인터넷을 통해 통신할 수 있도록 허용합니다.
통신에 사용할 수 있는 두 가지 프로토콜이 있습니다. 하나는 UDP, 다른 하나는 TCP입니다. UDP는 애플리케이션 간에 짧은 메시지(데이터 패킷으로 불립니다)를相互 전송할 수 있지만, 이 메시지의 전달을 보장할 수 없습니다. 또한, 문제가 발생할 수도 있습니다. 반면, TCP는 연결이 설정되면 바이트 스트림을 제공하며, 바이트는 순서대로 전달됩니다.
UDP를 사용하여 포트를 열는 간단한 예제를 보겠습니다.
-module(helloworld). -export([start/0]). start() -> {ok, Socket} = gen_udp:open(8789, io:fwrite("~p",[Socket]), io:fwrite("~p",[gen_udp:send (소켓,"localhost",8789,"Hello")]).
위 프로그램의 출력은 다음과 같습니다.
#Port<0.376>ok
포트를 열고 나면, 포트에서 메시지를 받을 수 있습니다. 이는 recv 메서드를 통해 완료됩니다. 문법과 다음 예제를 확인해 보겠습니다.
recv(Socket, 길이)
소켓 −이 gen_udp:open 명령어를 사용하여 생성된 소켓입니다.
Length −받아야 할 메시지의 길이는 이렇습니다.
메시지가 올바르게 전송되면 확인 메시지를 반환합니다.
-module(helloworld). -export([start/0]). start() -> {ok, Socket} = gen_udp:open(8789, io:fwrite("~p",[Socket]), io:fwrite("~p",[gen_udp:send(Socket,"localhost",8789,"Hello")]), io:fwrite("~p",[gen_udp:recv(Socket, 20)]).
현재 같은 프로그램에서 동일한 전송과 수신 메시지를 가질 수 없습니다. 다른 프로그램에서 정의해야 합니다. 따라서 다음과 같은 코드를 생성하여 메시지를 수신하는 서버 구성 요소와 메시지를 전송하는 클라이언트 구성 요소를 생성하겠습니다.
-module(helloworld). -export([start/0,client/1]). start() -> spawn(fun() -> server(4000) end). server(Port) -> {ok, Socket} = gen_udp:open(Port, [binary, {active, false}]), server socket~=~~p~n loop(Socket). loop(Socket) -> inet:setopts(Socket, [{active, once}]), receive {udp, Socket, Host, Port, Bin} -> server received:~p~n gen_udp:send(Socket, Host, Port, Bin), loop(Socket) 끝. client(N) -> {ok, Socket} = gen_udp:open(0, [binary]), client socket~=~~p~n 이후 ok = gen_udp:send(Socket, "localhost", 4000, N), Value = receive {udp, Socket, _, _, Bin} -> client received:~p~n 이후 2000 -> 0 end, gen_udp:close(Socket), Value.
위의 프로그램에 대해 주의해야 할 몇 가지 사항이 있습니다.
우리는 두 가지 함수를 정의했습니다. 첫 번째는 서버 함수로, 포트를 수신하기 위해 사용됩니다.4000. 두 번째는 클라이언트로, 서버 구성 요소에 "Hello" 메시지를 보내기 위해 사용됩니다.
수신 루프는 정의된 루프 내에서 전송된 메시지를 읽기 위해 사용됩니다.
이제 두 창에서 프로그램을 실행해야 합니다. 첫 번째 창은 Erlang 명령 프롬프트 창에서 다음 코드를 실행하여 서버 구성 요소를 실행합니다.
helloworld:start().
이는 명령 프롬프트 창에 다음 출력을 표시합니다.
서버가 소켓을 열었습니다: #Port<0.2314>
이제, 두 번째 Erlang 명령 프롬프트 창에서 다음 명령어를 실행하세요.
Helloworld:client(<<"Hello">}).
이 명령어를 실행할 때, 다음 출력이 첫 번째 명령 프롬프트 창에 표시됩니다.
서버가 <<"Hello">>를 수신했습니다: