2016-05-27 127 views
4

我在二郎新的,我想實現一個註冊/登錄服務器。我有一個函數來註冊新用戶,它工作得很好:競合二郎

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); 
    } 
    } 
} 
+1

客戶端可能正在等待回覆其註冊信息? –

+1

如果您在修改後包含整個程序,這將有所幫助。此外,最好在接收結束時添加一個catch-all子句,以便在服務器收到它不期望的消息時進行調試。 '_ - > throw({error,{unknown_message,Msg}})'。 – Amiramix

+0

@LynHeadley它看起來像那樣,但我不明白爲什麼,因爲我發送回覆(gen_tcp:發送)到我認爲的每個請求... –

回答

4

發送 「OK \ N」 爲響應 「雷吉斯托。」您的java代碼使用readline,因此您需要一個行終止符。

+0

非常感謝,多麼愚蠢的錯誤...... –