利用socket来实现erlang与c#之间的通讯-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 4961877
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

(921)

  • (2)
  • (2)
  • (4)
  • (100)
  • (5)
  • (30)
  • (1)
  • (2)
  • (1)
  • (54)
  • (266)
  • (6)
  • (0)
  • (82)
  • (4)
  • (36)
  • (6)
  • (19)
  • (0)
  • (1)
  • (52)
  • (4)
  • (12)
  • (14)
  • (9)
  • (0)
  • (6)
  • (151)
  • (41)
  • (11)
文章存档

(1)

(3)

(3)

(6)

(47)

(72)

(25)

(72)

(125)

(182)

(42)

(14)

(85)

(89)

(155)

我的朋友
最近访客
相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: erlang

2015-03-02 13:32:13

由于erlang在处理数据时在性能上具有一定的优越性,特别是在处理并发计算的时候。于是想着能不能实现c#与erlang之间的通讯,经过一天的编码,终于有所收获。

首先要注意的是,在erlang与c#之间,进行数据交换之前,都必须把数据转换成utf8的格式后,再获取其二进制数据,同时获取时也需要以utf8的格式获取,否则会出现乱码的现象,在这次实现的两者之间的socket通讯,不仅可以传送字母,数字,还可以传送中文字符,这一切都需要感谢r13版本中新增了处理unicode字符的unicode模块。

下面是erlang的代码。

1、socket的监听器,当数据到达了,把数据写入test_out.txt文件中,并且回复成功报文。

  1. -module(tcp_server).

  2. -compile([export_all]).

  3.  

  4. start_server() ->

  5. {ok,listen} = gen_tcp:listen(2345,[binary,{packet,0},{reuseaddr,true},{active,true}]),

  6. seq_loop(listen).

  7.  


  8. seq_loop(listen) ->

  9. {ok,socket} = gen_tcp:accept(listen),

  10. loop(socket),

  11. seq_loop(listen).

  12.  


  13. loop(socket) ->

  14. receive

  15. {tcp,socket,bin} ->

  16. io:format("server received binary = ~p~n",[bin]),

  17. file:write_file("test_out.txt", bin),


  18. %[desclist] = io_lib:format("~ts", ["ok"]),

  19. %descbin = erlang:iolist_to_binary(desclist),

  20. %desclist2 = unicode:characters_to_list(descbin),

  21. %list = desclist2,

  22. %bin1 = unicode:characters_to_binary(list),

  23. bin1 = unicode_test:test2(),

  24. io:format("server replying = ~p~n",[bin1]),

  25. gen_tcp:send(socket,bin1),

  26. loop(socket);

  27. {tcp_closed,socket} ->

  28. io:format("server socket closed ~n")

  29. end.


2、下面一段代码是获取获取当回复的数据位中文时的二进制代码,上面那段代码中的回复中文字符转换成二进制数据时会出错,不知道什么原因,但是把相同的代码拷贝到另外一个模块中,然后再调用,就能正常的运行,很郁闷。不过上面的那段注释了的代码如果处理非中文字符却是正常的。


  1. -module(unicode_test).

  2. -compile([export_all]).

  3.  

  4. test2() ->

  5.     [desclist] = io_lib:format("~ts", ["处理成功"]),

  6.     descbin = erlang:iolist_to_binary(desclist),

  7.     desclist2 = unicode:characters_to_list(descbin),

  8.     bin = unicode:characters_to_binary(desclist2),

  9.     bin.

以上的都是erlang代码,下面的是c#代码:


  1. static void main(string[] args)

  2.         {

  3.              int32 port = 2345;

  4.  

  5.              string str = "在list中,每个unicode字符采用integer来表示,因此与latin1的list相比,unicode list中,element的数值可以大于255。下面就是一个有效的unicode list: [1024, 1025]";

  6.  

  7.              tcpclient client = new tcpclient("localhost", port);

  8.              byte[] data = system.text.encoding.utf8.getbytes(str);

  9.              networkstream stream = client.getstream();

  10.              stream.write(data, 0, data.length);

  11.  

  12.              console.writeline("sent: {0}", str);

  13.  

  14.              data = new byte[256];

  15.  

  16.              // string to store the response ascii representation.

  17.              string responsedata = string.empty;

  18.  

  19.              // read the first batch of the tcpserver response bytes.

  20.              int32 bytes = stream.read(data, 0, data.length);

  21.              responsedata = system.text.encoding.utf8.getstring(data, 0, bytes);

  22.              console.writeline("received: {0}", responsedata);

  23.  

  24.              console.readkey(true);

  25.  

  26.         }

在erl shell中利用c("unicode_test")、c("tcp_server")代码编码上面的两个模块后,后执行tcp_server:start_server()。然后在c#执行代码,就能看到效果了。






阅读(2545) | 评论(0) | 转发(0) |
0

上一篇:

下一篇:

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图