erlang 学习笔记 1 socket 属性

最近开始学习erlang, 发现其对分布式支持真是强大,比如在C++等语言中网络包的粘包问题,在erlang中通过设置scoket的{packet, N}属性就回默认将包长添加在发送包的前面;通过{active, true} 或者{active, false}就能设定网络IO的主动通知或被动收取;erlang服务端如下:
-module(server).
-export([start/1, loop/1]).

start(Port) ->
	{ok, Listen} = gen_tcp:listen(Port, [binary, {active, true}, {packet,2}]),
	{ok, Socket} = gen_tcp:accept(Listen),
	loop(Socket).	

loop(Socket) ->
	receive
		{tcp, Socket, Data} ->
			io:format("Recv Pkg~p~n", [Data]),
			gen_tcp:send(Socket, "Hello World!"),
			loop(Socket)
	end.
		  

python客户端代码如下:
#!/usr/bin/env python

import socket
import struct
import time

if __name__ == '__main__':

	socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	socket.connect(('localhost', 9999))

	buffer = struct.pack('!H5s', 5, 'abcde')
	socket.send(buffer[0:2])
	time.sleep(5) #检查粘包,及erlang消息推送完整检验
	socket.send(buffer[2:7])

	r_buffer = socket.recv(100)

	if len(r_buffer) > 2 :
		print struct.unpack('!H', r_buffer[0:2])#打印erlang推送包的包头前置长度信息
   		print r_buffer


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值