由于erlang在处理数据时在性能上具有一定的优越性,特别是在处理并发计算的时候。于是想着能不能实现c#与erlang之间的通讯,经过一天的编码,终于有所收获。
首先要注意的是,在erlang与c#之间,进行数据交换之前,都必须把数据转换成utf8的格式后,再获取其二进制数据,同时获取时也需要以utf8的格式获取,否则会出现乱码的现象,在这次实现的两者之间的socket通讯,不仅可以传送字母,数字,还可以传送中文字符,这一切都需要感谢r13版本中新增了处理unicode字符的unicode模块。
下面是erlang的代码。
1、socket的监听器,当数据到达了,把数据写入test_out.txt文件中,并且回复成功报文。
-
-module(tcp_server).
-
-
-compile([export_all]).
-
-
-
-
start_server() ->
-
-
{ok,listen} = gen_tcp:listen(2345,[binary,{packet,0},{reuseaddr,true},{active,true}]),
-
-
seq_loop(listen).
-
-
-
-
-
seq_loop(listen) ->
-
-
{ok,socket} = gen_tcp:accept(listen),
-
-
loop(socket),
-
-
seq_loop(listen).
-
-
-
-
-
loop(socket) ->
-
-
receive
-
-
{tcp,socket,bin} ->
-
-
io:format("server received binary = ~p~n",[bin]),
-
-
file:write_file("test_out.txt", bin),
-
-
-
%[desclist] = io_lib:format("~ts", ["ok"]),
-
-
%descbin = erlang:iolist_to_binary(desclist),
-
-
%desclist2 = unicode:characters_to_list(descbin),
-
-
%list = desclist2,
-
-
%bin1 = unicode:characters_to_binary(list),
-
-
bin1 = unicode_test:test2(),
-
-
io:format("server replying = ~p~n",[bin1]),
-
-
gen_tcp:send(socket,bin1),
-
-
loop(socket);
-
-
{tcp_closed,socket} ->
-
-
io:format("server socket closed ~n")
-
-
end.
2、下面一段代码是获取获取当回复的数据位中文时的二进制代码,上面那段代码中的回复中文字符转换成二进制数据时会出错,不知道什么原因,但是把相同的代码拷贝到另外一个模块中,然后再调用,就能正常的运行,很郁闷。不过上面的那段注释了的代码如果处理非中文字符却是正常的。
-
-module(unicode_test).
-
-
-compile([export_all]).
-
-
-
-
test2() ->
-
-
[desclist] = io_lib:format("~ts", ["处理成功"]),
-
-
descbin = erlang:iolist_to_binary(desclist),
-
-
desclist2 = unicode:characters_to_list(descbin),
-
-
bin = unicode:characters_to_binary(desclist2),
-
-
bin.
以上的都是erlang代码,下面的是c#代码:
-
static void main(string[] args)
-
-
{
-
-
int32 port = 2345;
-
-
-
-
string str = "在list中,每个unicode字符采用integer来表示,因此与latin1的list相比,unicode list中,element的数值可以大于255。下面就是一个有效的unicode list: [1024, 1025]";
-
-
-
-
tcpclient client = new tcpclient("localhost", port);
-
-
byte[] data = system.text.encoding.utf8.getbytes(str);
-
-
networkstream stream = client.getstream();
-
-
stream.write(data, 0, data.length);
-
-
-
-
console.writeline("sent: {0}", str);
-
-
-
-
data = new byte[256];
-
-
-
-
// string to store the response ascii representation.
-
-
string responsedata = string.empty;
-
-
-
-
// read the first batch of the tcpserver response bytes.
-
-
int32 bytes = stream.read(data, 0, data.length);
-
-
responsedata = system.text.encoding.utf8.getstring(data, 0, bytes);
-
-
console.writeline("received: {0}", responsedata);
-
-
-
-
console.readkey(true);
-
-
-
-
}
在erl shell中利用c("unicode_test")、c("tcp_server")代码编码上面的两个模块后,后执行tcp_server:start_server()。然后在c#执行代码,就能看到效果了。
阅读(2545) | 评论(0) | 转发(0) |