erlang gen_tcp并发测试

服务端使用erlang实现的简单echo功能,客户端采用C#开发的Winform程序。客户端开启1000个线程,每个线程向服务端发送多次固定文本,并从服务端接收返回的内容。

结论:1000个并发轻松实现,测试2000个并发也可以。在多的并发客户端崩盘。说明erlang在并发能力上非常强悍。


-module(tcp_server).

-export([start/0]).

start()->
  %%启动tcp侦听
  {ok, Listen}=gen_tcp:listen(2345, [binary, {packet, 0}, {reuseaddr, true}, {active, true}]),
  %%开启进程等待客户端连接
  spawn(fun() -> accept_connect(Listen) end).
  
accept_connect(Listen) ->
  %%收到客户端连接
  {ok, Socket} = gen_tcp:accept(Listen),
  %%开启进程等待客户端连接
  spawn(fun() -> accept_connect(Listen) end),
  %%与客户端通信
  loop(Socket).
  
loop(Socket)->
  receive
    {tcp, Socket, Bin} ->
 gen_tcp:send(Socket, Bin),
 io:format("receive:~p~n", [Bin]),
 loop(Socket);
    {tcp_closed, Socket} ->
 io:format("Server socket closed~n")

  end.


using System;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;


namespace tcp_client
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 500; i++)
            {
                Thread t = new Thread(new ThreadStart(Echo));
                t.IsBackground = true;
                t.Start();
            }
        }


        private void Echo()
        {
            TcpClient tcpClient = new TcpClient();
            tcpClient.Connect(IPAddress.Parse("127.0.0.1"), 2345);
             
            NetworkStream ns = tcpClient.GetStream();
            string str = textBox2.Text;
            byte[] bytes = Encoding.UTF8.GetBytes(str);
            for (int i = 0; i < 100; i++)
            {
                ns.Write(bytes, 0, bytes.Length);
                ns.Flush();
                int maxLen = 1000;
                byte[] recvBuffer = new byte[1000];


                int len = ns.Read(recvBuffer, 0, maxLen);
                string recvStr = Encoding.UTF8.GetString(recvBuffer, 0, len);
                int threadId = Thread.CurrentThread.ManagedThreadId;
                this.Invoke(new Action(() =>
                    {
                        textBox1.AppendText("Thread-" +threadId.ToString() + ":"+ recvStr+"--" + i.ToString() + "\r\n");
                        Application.DoEvents();
                    }));
            }
            ns.Close();
            tcpClient.Close();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值