• TcpClient连续发送数据以后报错:通常每个套接字地址(协议/网络地址/端口)只允许使用一次

  • 本文关于 c#
  • CodeGo.net > TcpClient连续发送数据以后报错:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
  •  

    TcpClient连续发送数据以后报错:通常每个套接字地址(协议/网络地址/端口)只允许使用一次



    c#
    客户端端连续不断的用TcpClient往服务器发送数据,服务器端开一个线程去监听端口并且接收处理数据 但是在发送3800次左右以后,发送数据的地方报错:通常每个套接字地址(协议/网络地址/端口)只允许使用一次 主要
    客户端端:
    	public void Post(byte[] b)
    {
    TcpClient client = null;
    NetworkStream ns = null;
    try
    {
    client = new TcpClient();
    client.Connect(Ip, Port); //这个方法被调用3800次左右以后,这里报错:通常每个套接字地址(协议/网络地址/端口)只允许使用一次  client.ReceiveTimeout = 300000;
    ns = client.GetStream();
    //发送至服务器端
    ns.Write(b, 0, b.Length);
    ns.Flush();
    }
    catch (Exception e)
    {
    }
    finally
    {
    if (ns != null)
    {
    ns.Close();
    ns.Dispose();
    }
    if (client != null)
    {
    client.Close();
    }
    }
    }
    服务器端:
    	public class ServerClient
    {
    private TcpListener tcpListener = null;
    //下面这个线程用来监听端口,在服务器开启以后就启动下面的线程
    private Thread threadTcp = null;
    threadTcp = new Thread(new ThreadStart(tcpServerProcess));
    threadTcp.Start();
    private void tcpServerProcess()
    {
    try
    {
    tcpListener = new TcpListener(IPAddress.Any, Port);
    tcpListener.Start();
    while (true)
    {
    try
    {
    TcpClient tcpClient = tcpListener.AcceptTcpClient();
    ThreadPool.QueueUserWorkItem(new WaitCallback(ReciveTcp), tcpClient);
    }
    catch
    {
    }
    }
    }
    catch
    {
    }
    }
    private void ReciveTcp(object state)
    {
    TcpClient client = state as TcpClient;
    NetworkStream ns = null;
    try
    {
    client.ReceiveTimeout = 300000;
    ns = client.GetStream();
    byte[] bytes = new byte[client.ReceiveBufferSize];
    ns.Read(bytes, 0, (int)client.ReceiveBufferSize);
    //处理数据
    }
    catch
    {
    }
    finally
    {
    if (ns != null)
    {
    ns.Close();
    ns.Dispose();
    }
    if (client != null)
    {
    client.Close();
    }
    }
    }
    }

    本文地址 :CodeGo.net/1482646/
    -------------------------------------------------------------------------------------------------------------------------
    1.在出错的时候试一下telnet去那个端口,server端是不是的确没反应。另外server端是不是每个client disconnect后ReceiveTcp也退出 所谓同步3800异步7500还有连接池什么的是在误导,那是并发连接数,跟你这个不相关。
    2. 服务端端最好用异步的,客户端端可以用阻塞的方式。
    3. 但是在发送3800次左右以后,发送数据的地方报错:
    ----------------------------------------------
    你做的同步的话 3800 估计也是到头
    你改成异步的 7500左右 或者做个连接池
    加个端口复用 基本这些问题 都解决
    效率也会提高
    4. 我推荐你用多线程异步的方式来处理 ,不管是速度还是准确性都会相对的更高。
    5. client.Connect(Ip, Port);
    放到外面吧..不需要每发送一个包就连一次的...错误就发生在这里...
    本文标题 :TcpClient连续发送数据以后报错:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
    本文地址 :CodeGo.net/1482646/
    1. 正在与IContainers一个更好的想法的ObjectFactory直接(StructureMap的)?
    2. ref int 的应用 - -!
    3. 过滤每列一个DataGridView与过滤器上面列可见
    4. 查询url文件流
    5. 与String.Format和log.DebugFormat货币
    6. 微软企业库 5 ,设置缓存
    7. 正则表达式C#
    8. 關於計算C#中的加減乘除
    9. 发送前的C#SSL数据流不会停止缓冲
    10. 自定义打印多个datatable

     
    

    Copyright © 2017 CodeGo.net
    http://codego.net/xinwen/ 足球比分网 足球比分 医药招商网 邵阳县新闻