利用Socket来实现Erlang与C#之间的通讯

7 篇文章 0 订阅

由于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#执行代码,就能看到效果了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值