Erlang的gen_tcp模块packet可以指定多种参数,实现不同的数据解析方式,这里说一下line和http两种不同方式下解析的方式
-module(my_chat_server). -export([start/1, start/0]). start() -> start(8081). start(Port) -> spawn_link(fun() -> start_listen(Port) end). start_listen(Port) -> %here DefaultOptions = [{packet, line}, {active, false}, {reuseaddr, true}], case gen_tcp:listen(Port, DefaultOptions) of {ok, ListenSocket} -> par_connect(ListenSocket); {error, Reason} -> {error, Reason} end. par_connect(LS) -> case gen_tcp:accept(LS) of {ok, Socket} -> spawn(fun() -> par_connect(LS) end), io:format("accept socket connection, socket=~w~n", [Socket]), loop(Socket); {error, Reason} -> {eorror, Reason} end. loop(Socket) -> case gen_tcp:recv(Socket, 0) of {ok, Bin} -> %do with socket... io:format("deal socket data, socket=~w, data=~p~n", [Socket, Bin]), loop(Socket); {error, closed} -> io:format("socket closed, socket=~w~n", [Socket]) end.
2> my_chat_server:start(). <0.40.0> accept socket connection, socket=#Port<0.1887> deal socket data, socket=#Port<0.1887>, data="GET / HTTP/1.1\r\n" deal socket data, socket=#Port<0.1887>, data="Host: localhost:8081\r\n" deal socket data, socket=#Port<0.1887>, data="Connection: keep-alive\r\n" deal socket data, socket=#Port<0.1887>, data="User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.9 Safari/533.2\r\n" deal socket data, socket=#Port<0.1887>, data="Cache-Control: max-age=0\r\n" deal socket data, socket=#Port<0.1887>, data="Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n" deal socket data, socket=#Port<0.1887>, data="Accept-Encoding: gzip,deflate,sdch\r\n" deal socket data, socket=#Port<0.1887>, data="Accept-Language: en-US,en;q=0.8\r\n" deal socket data, socket=#Port<0.1887>, data="Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n" deal socket data, socket=#Port<0.1887>, data="Cookie: AJSTAT_ok_times=1; _csuid=X4b5025bb3a94d53c; view_history=47451%2Cd7dad2a908d74be19d89cbfdb355d7bc%2C62cc19edb111424a98f22dd904ccd281%2Cd5cedcf1263542c790c46a158b77e5e8%2C9de94a4094184dff97a53afe3b2cfc94%2Cdb6c1cea4986466e98b290b26d62518b\r\n" deal socket data, socket=#Port<0.1887>, data="\r\n"
1> my_chat_server:start(). <0.34.0> accept socket connection, socket=#Port<0.440> deal socket data, socket=#Port<0.440>, data={http_request,'GET', {abs_path,"/"}, {1,1}} deal socket data, socket=#Port<0.440>, data={http_header,14,'Host',undefined, "localhost:8081"} deal socket data, socket=#Port<0.440>, data={http_header,2,'Connection', undefined,"keep-alive"} deal socket data, socket=#Port<0.440>, data={http_header,24,'User-Agent', undefined, "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.9 Safari/533.2"} deal socket data, socket=#Port<0.440>, data={http_header,1,'Cache-Control', undefined,"max-age=0"} deal socket data, socket=#Port<0.440>, data={http_header,8,'Accept', undefined, "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"} deal socket data, socket=#Port<0.440>, data={http_header,10, 'Accept-Encoding',undefined, "gzip,deflate,sdch"} deal socket data, socket=#Port<0.440>, data={http_header,11, 'Accept-Language',undefined, "en-US,en;q=0.8"} deal socket data, socket=#Port<0.440>, data={http_header,9,'Accept-Charset', undefined, "ISO-8859-1,utf-8;q=0.7,*;q=0.3"} deal socket data, socket=#Port<0.440>, data={http_header,50,'Cookie', undefined, "AJSTAT_ok_times=1; _csuid=X4b5025bb3a94d53c; view_history=47451%2Cd7dad2a908d74be19d89cbfdb355d7bc%2C62cc19edb111424a98f22dd904ccd281%2Cd5cedcf1263542c790c46a158b77e5e8%2C9de94a4094184dff97a53afe3b2cfc94%2Cdb6c1cea4986466e98b290b26d62518b"} deal socket data, socket=#Port<0.440>, data=http_eoh
2010-04-24 17:31:59, 1174 reviews, comment
send to mailbox
Erlang TCP Server例子
MochiChat: 一个基于erlang的web聊天室(beta)
少女,不点下广告吗!
all by shitou
blog comments powered by Disqus