我在二郎新的,我想實現一個註冊/登錄服務器。我有一個函數來註冊新用戶,它工作得很好:競合二郎
reg(Sock) ->
receive
{tcp, _, Usr} ->
io:format("User: ~p ~n",[Usr])
end,
gen_tcp:send(Sock, [Usr]),
receive
{tcp, _, Pass} ->
io:format(" a pass ~p~n",[Pass])
end,
gen_tcp:send(Sock, [Pass]),
receive
{tcp, _, Msg} ->
case Msg of
<<"condutor\n">> ->
condutor ! {register, {Usr, Pass}};
<<"passageiro\n">> ->
io:format("passageiro~n")
end
end.
但現在我想,如果有用戶想要登錄或註冊,併發送正確的功能controlls另一個函數。但是,當我添加此功能,它不讀取用戶的輸入:
gestor(Sock) ->
receive
{tcp, _, Msg} ->
case Msg of
<<"login\n">> ->
login(Sock);
<<"registo\n">> ->
gen_tcp:send(Sock, "OK"),
reg(Sock)
end
end.
它接收用戶的選擇,送他到右邊的功能,但那麼它不讀什麼,我可以」不明白這一點,因爲如果我直接調用函數reg
它可以正常工作,但如果我從另一個函數調用該函數,則無法從套接字中讀取任何內容。
如果有人可以幫助我,我會apreciate非常喜歡。
編輯: 非常感謝您的答覆,我試圖實現一個Java客戶端和一個通過Tcp套接字進行通信的Erlang服務器,它的目的是讓用戶輸入「registo」而不是用戶名,密碼和「condutor」或「passageiro」。
套接字工作正常,因爲如果我調用reg(sock)而不是gestor(sock),一切按預期工作,問題是當我在這種情況下我無法接收到調用reg(Sock)用戶輸入reg函數。
-module(server2).
-export([server/1]).
server(Port) ->
{ok, LSock} = gen_tcp:listen(Port, [binary, {packet, line}, {reuseaddr, true}]),
Condutor = spawn(fun()-> regUtente([]) end),
register(condutor, Condutor),
acceptor(LSock).
acceptor(LSock) ->
{ok, Sock} = gen_tcp:accept(LSock),
spawn(fun() -> acceptor(LSock) end),
io:format("Ligação estabelecida~n"),
% reg(Sock). --- Caling reg directly, without passing through gestor WORKS FINE.
gestor(Sock).
Java客戶端:
import java.io.*;
import java.net.*;
public class EchoClient {
public static void main(String[] args) throws IOException {
if (args.length != 2) {
System.err.println(
"Usage: java EchoClient <host name> <port number>");
System.exit(1);
}
String hostName = args[0];
int portNumber = Integer.parseInt(args[1]);
try (
Socket echoSocket = new Socket(hostName, portNumber);
PrintWriter out =
new PrintWriter(echoSocket.getOutputStream(), true);
BufferedReader in =
new BufferedReader(
new InputStreamReader(echoSocket.getInputStream()));
BufferedReader stdIn =
new BufferedReader(
new InputStreamReader(System.in))
) {
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("echo: " + in.readLine());
}
} catch (UnknownHostException e) {
System.err.println("Don't know about host " + hostName);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to " +
hostName);
System.exit(1);
}
}
}
客戶端可能正在等待回覆其註冊信息? –
如果您在修改後包含整個程序,這將有所幫助。此外,最好在接收結束時添加一個catch-all子句,以便在服務器收到它不期望的消息時進行調試。 '_ - > throw({error,{unknown_message,Msg}})'。 – Amiramix
@LynHeadley它看起來像那樣,但我不明白爲什麼,因爲我發送回覆(gen_tcp:發送)到我認爲的每個請求... –