<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      erlang聊天室

      服務(wù)端

      點(diǎn)擊查看代碼
      %%%-------------------------------------------------------------------
      %%% @author wujj
      %%% @copyright (C) 2021, <COMPANY>
      %%% @doc
      %%%
      %%% @end
      %%% Created : 08. 8月 2021 13:33
      %%%-------------------------------------------------------------------
      -module(chatserv).
      -author("wujj").
      
      %% API
      -compile(export_all).
      -import(ets, [insert_new/2]).
      
      start_server() ->
        ets:new(id, [ordered_set, public, named_table, {write_concurrency, true}, {read_concurrency, true}]),
        case gen_tcp:listen(1234, [binary, {packet, 0}, {active, true}]) of
          {ok, ListenSocket} ->
            spawn(fun() -> client_connect(ListenSocket) end);
          {error, Reason} ->
            io:format("~p~n", [Reason])
        end.
      
      
      client_connect(ListenSocket) ->
        case gen_tcp:accept(ListenSocket) of
          {ok, Socket} ->
            %% 進(jìn)行驗(yàn)證,看是否是注冊(cè)還是登錄
            spawn(fun() -> client_connect(ListenSocket) end),
            loop(Socket);
          {error, Reason} ->
            io:format("~p~n", [Reason])
        end.
      
      loop(Socket) ->
        receive
          {tcp, Socket, Bin} ->
            [Id, Sign, PassWord, SendId, MessageInfos] = binary_to_term(Bin),
            if
              Sign =:= register_user ->
                Info = register_user(Id, PassWord, Socket),
                gen_tcp:send(Socket, term_to_binary(Info)),
                loop(Socket);
              Sign =:= login_user ->
                Info = login_user(Id, PassWord, Socket),
                gen_tcp:send(Socket, term_to_binary(Info)),
                loop(Socket);
              Sign =:= login_out ->
                Info = login_out(Id, Socket),
                gen_tcp:send(Socket, term_to_binary(Info)),
                loop(Socket);
              Sign =:= private_msg ->
                private_chat(SendId, Socket, MessageInfos),
                loop(Socket);
              Sign =:= group_msg ->
                group_chat(Socket, MessageInfos),
                loop(Socket);
              true ->
                io:format("error sign ~n"),
                loop(Socket)
            end;
          {tcp_closed, Socket} ->
            io:format("Server socket closed ~n")
        end.
      
      %% 用戶(hù)注冊(cè)
      register_user(Id, PassWord, Socket) ->
        case ets:lookup(id, Id) of
          [_Ok] ->
            io:format("Account is fail ~n"),
            "Account is exist ~n";
          _ ->
            ets:insert(id, {Id, PassWord, 0, Socket}),
            "register successed ~n"
        end.
      
      %% 用戶(hù)登錄
      login_user(Id, PassWord, Socket) ->
        case ets:match_object(id, {Id, PassWord, 0, Socket}) of
          [_Ok] ->
            ets:update_element(id, Id, [{3, 1}, {4, Socket}]),
            "login successed";
          Reson ->
            io:format("login is fail ~n ~p", [Reson]),
            "Password error or Account is not exist ~n"
        end.
      
      %% 退出用戶(hù)
      login_out(Id, Socket) ->
        %% 因?yàn)閕d對(duì)應(yīng)唯一socket,所以不需要PassWord
        case ets:match_object(id, {Id, '_', 1, Socket}) of
          [_Ok] ->
            ets:update_element(id, Id, [{3, 0}, {4, 0}]),
            "login successed";
          _ ->
            io:format("out is fail ~n"),
            "login is fail"
        end.
      
      %% 群聊
      group_chat(Socket, MessageInfos) ->
        case ets:match_object(id, {'_', '_', 1, Socket}) of
          [{Id, _, _, _}] ->
            Res = ets:match_object(id, {'_', '_', 1, '_'}),
            case Res =:= [] of
              true ->
                io:format("no person online ~p ~n", [Res]);
              _ ->
                group_send_msg(Res, Id, MessageInfos)
            end;
          _ ->
            io:format("group chat is fail ~n")
        end.
      
      
      %% 群聊發(fā)送
      group_send_msg([], _Id, _MessageInfos) ->
        next;
      group_send_msg([Info | Infos], Id, MessageInfos) ->
        {_, _, _, Socket} = Info,
        gen_tcp:send(Socket, term_to_binary("from: " ++ integer_to_list(Id) ++ "say: " ++ MessageInfos)),
        group_send_msg(Infos, Id, MessageInfos).
      
      %% 在線(xiàn)私聊
      private_chat(SendId, Socket, MessageInfos) ->
        case ets:match_object(id, {'_', '_', 1, Socket}) of
          [{Id, _, _, _}] ->
            Res = ets:match_object(id, {SendId, '_', 1, '_'}),
            case Res =:= [] of
              true ->
                io:format("send person not online ~p ~n", [Res]);
              _ ->
                private_send_msg(Res, Id, MessageInfos)
            end;
          _ ->
            io:format("private chat is fail ~n")
        end.
      
      %% 私聊發(fā)送
      private_send_msg([Info], Id, MessageInfos) ->
        {_, _, _, Socket} = Info,
        gen_tcp:send(Socket, term_to_binary("from: " ++ integer_to_list(Id) ++ "say: " ++ MessageInfos)).
      
      
      客戶(hù)端
      點(diǎn)擊查看代碼
      %%%-------------------------------------------------------------------
      %%% @author wujj
      %%% @copyright (C) 2021, <COMPANY>
      %%% @doc
      %%%
      %%% @end
      %%% Created : 08. 8月 2021 14:03
      %%%-------------------------------------------------------------------
      -module(chatclient).
      -author("wujj").
      
      %% API
      -compile(export_all).
      
      %客戶(hù)端
      start_client() ->
        {ok, Socket} = gen_tcp:connect("localhost", 1234, [binary, {packet, 0}]),  %連接服務(wù)器
        %新建一個(gè)進(jìn)程負(fù)責(zé)接收消息
        Pid = spawn(fun() -> loop() end),
        gen_tcp:controlling_process(Socket, Pid),
        sendMsg(Socket).
      
      loop() ->
        receive
          {tcp, _Socket, Bin} ->
            Res = binary_to_term(Bin),
            io:format("Message Info! ~p ~n", [Res]),
            loop();
          {tcp_closed, _Socket} ->
            io:format("Socket is closed! ~n")
        end.
      
      sendMsg(Socket) ->
        S = io:get_line("select operation: "),
        {Sign, _Info} = string:to_integer(S),
        SendMsg = operation_message(Sign),
        gen_tcp:send(Socket, term_to_binary(SendMsg)),
        sendMsg(Socket).
      
      %% 用戶(hù)注冊(cè)
      operation_message(1) ->
        I = io:get_line("id: "),
        {Id, _Info} = string:to_integer(I),
        Password = io:get_line("register password: "),
        [Id, register_user, Password, 0, 0];
      %% 用戶(hù)登錄
      operation_message(2) ->
        I = io:get_line("id:"),
        Password = io:get_line("login password: "),
        {Id, _Info} = string:to_integer(I),
        [Id, login_user, Password, 0, 0];
      %% 用戶(hù)退出
      operation_message(3) ->
        I = io:get_line("id: "),
        {Id, _Info} = string:to_integer(I),
        [Id, login_out, 0, 0, 0];
      %% 私聊
      operation_message(4) ->
        Sd = io:get_line("send_id: "),
        Msg = io:get_line("MsgInfo: "),
        {SendId, _Info} = string:to_integer(Sd),
        [0, private_msg, 0, SendId, Msg];
      %% 群聊
      operation_message(5) ->
        Msg = io:get_line("MsgInfo: "),
        [0, group_msg, 0, 0, Msg];
      %% 無(wú)效操作
      operation_message(_) ->
        Msg = io:format("invalid_operation ~n"),
        [0, invalid_operation, 0, 0, Msg].
      
      
      posted @ 2024-06-25 01:02  酷i  閱讀(33)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 热久久美女精品天天吊色| 国产精品美腿一区在线看| 国产精品久久久国产盗摄| 91精品国产老熟女在线| 国产色精品久久人妻| 国产精品自拍视频第一页| 沙田区| 日韩精品成人区中文字幕| 影音先锋在线资源无码| 亚洲午夜精品毛片成人播放| 大战丰满无码人妻50p| 久久久久久综合网天天| 国产农村激情免费专区| 韩国无码AV片在线观看网站| 亚洲欧美人成电影在线观看| 日韩欧美aⅴ综合网站发布| 亚洲精品岛国片在线观看| 午夜福利激情一区二区三区| 日日猛噜噜狠狠扒开双腿小说| 亚亚洲视频一区二区三区| 亚洲综合一区二区精品导航| 国产高清精品在线91| 日本中文字幕不卡在线一区二区 | 成人亚洲一级午夜激情网| 特级做a爰片毛片免费看无码| 免费看的日韩精品黄色片| 中文字幕国产精品av| 肥臀浪妇太爽了快点再快点| 国产一精品一av一免费| 精品伊人久久久香线蕉| 1精品啪国产在线观看免费牛牛| 老司机午夜免费精品视频| 亚洲各类熟女们中文字幕| 中文字幕精品亚洲二区| 欧美福利电影A在线播放| 国产精品一区二区小视频| 纯肉高h啪动漫| 日日爽日日操| 新宾| 国产三级精品三级在线区| 国产一区二区三区禁18|