服务端使用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();
}
}
}