socket #-C#SOCKET长连接小数据程序未响应

问题描述

C#SOCKET长连接小数据程序未响应

最近由于业务的需要,Linux系统嵌入式设备往我做的服务程序发送数据。
速度奇慢,而且还是程序无响应。后来自己用C#写了一个客户端用来测试。已经用了线程池,不知道用法对不对。请大家帮忙看下。

服务端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using System.Net;

namespace consoleSocketServer
{
class Program
{
static int socketCount = 0;
static Socket serverSocket;
static Socket clientSocket;
public static int clientcount = 0;
public int clientnum = 0;
static int listSQL = 0;
static bool asy = true;
public static Int32 portServer = 0;
public static string ipServer = "";
public static Thread threadSocketListen;
public static Thread threadDoWork;
public static Thread threadInsert;
public static int countsql = 0;
static void Main(string[] args)
{
IPAddress ipAddress;
portServer = 4660;
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        ipAddress = IPAddress.Parse("192.168.33.29");
        ipServer = ipAddress.ToString();

        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, portServer);

        Console.WriteLine("服务器IP:" + ipServer + "  端口:" + portServer);
        serverSocket.Bind(localEndPoint);
        serverSocket.Listen(20);
        //设置线程池
        ThreadPool.SetMaxThreads(4, 4);
        //开启新的线程监听
        threadSocketListen = new Thread(SocketListen);
        threadSocketListen.Start();

        Console.WriteLine("服务启动成功");
    }

    static void SocketListen()
    {
        while (true)
        {

            //接受客户端信息
            clientSocket = serverSocket.Accept();
            //开启处理线程
            ThreadPool.QueueUserWorkItem(new WaitCallback(doWork));

            //threadDoWork = new Thread(new ThreadStart(doWork));
            //threadDoWork.Start();

        }
    }
    /// <summary>
    /// 处理方法
    /// </summary>
    static void doWork(object a)
    {

        //获取客户端信息
        IPEndPoint ipEndPoint = (IPEndPoint)clientSocket.RemoteEndPoint;
        string address = ipEndPoint.Address.ToString();
        //Console.WriteLine(address + ":连接成功");

        //取消息
        byte[] inBuffer = new byte[1024];
        byte[] outBuffer = new byte[8];
        string inBufferStr = "";
        int rec = 0;
        StringBuilder sb = new StringBuilder();
        while (true)
        {
            try
            {
                rec = clientSocket.Receive(inBuffer);//如果没有消息为空 阻塞 当前循环
                //收到的长度不够 忽略此次数据
                if (rec <= 8)
                {
                    continue;
                }

                int ll = inBuffer[4] + inBuffer[5] * 255;

                inBufferStr = Encoding.UTF8.GetString(inBuffer, 8, ll);

                Console.WriteLine(inBufferStr);

                //回复收到
                outBuffer[4] = 0;
                outBuffer[5] = 0;
                outBuffer[6] = 0;
                outBuffer[7] = 0;
                outBuffer[3] = 0;
                outBuffer[2] = 0;
                outBuffer[1] = 0;
                outBuffer[0] = 1;

                clientSocket.Send(outBuffer, outBuffer.Length, SocketFlags.None);
                socketCount++;
                Console.WriteLine(socketCount.ToString());
                //break;
            }
            catch (SocketException es)
            {
                //clientSocket.Close();
                return;
            }

        }

    }
}

}

客户端:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace SocketClient
{
class Program
{
static Socket clientSocket;
static void Main(string[] args)
{
try
{
//将网络端点表示为IP地址和端口 用于socket侦听时绑定
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.33.29"), 4660);

            clientSocket = new Socket(ipep.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            //将Socket连接到服务器
            clientSocket.Connect(ipep);

            string outBufferStr;
            //发送消息
            outBufferStr = "123456789qwe|789654123|1|2015-04-22 10:51:34|6|test1|test2| ";
            byte[] tempb = Encoding.UTF8.GetBytes(outBufferStr);

            byte[] outBuffer = new byte[tempb.Length + 8];

            //加功能和长度
            outBuffer[0] = 1;
            outBuffer[1] = 0;
            outBuffer[2] = 0;
            outBuffer[3] = 0;
            outBuffer[4] = Convert.ToByte(tempb.Length % 255);
            outBuffer[5] = Convert.ToByte(tempb.Length / 255);
            outBuffer[6] = 0;
            outBuffer[7] = 0;

            for (int i = 0; i < tempb.Length; i++)
            {
                outBuffer[8 + i] = tempb[i];
            }

            // Byte[] inBuffer = new Byte[1024];

            int kkk = 0;
            while (kkk <= 10000)
            {

                clientSocket.Send(outBuffer, outBuffer.Length, SocketFlags.None);
                kkk++;
                Thread.Sleep(1);
                Console.WriteLine(kkk.ToString());
                //Console.WriteLine("服务器响应:");
                //接收服务器端信息
                //clientSocket.Receive(inBuffer, 1024, SocketFlags.None);
                //Console.WriteLine(Encoding.ASCII.GetString(inBuffer));
            }
            Console.WriteLine(kkk.ToString());
            Console.ReadLine();
        }
        catch (Exception exp)
        {
            Console.WriteLine(exp.Message);
            Console.ReadLine();

        }
    }

}

}

客户端收到数据,显示出来,在回发一个byte[] 1 0 0 0 0 0 0 0 用于确认收到。
实际上目前客户端没有对服务端收到的数据做处理,因为那样又要多开一个线程。
但是现在问题就是这样简单的测试发送10000条数据,居然会卡死,很纳闷。我前几天见他们Linux自己写的程序发送1W条数据,就是2 3秒的时间。请大神指导。难道C#真的是不能做服务端的程序?

解决方案

。。。。我的天,我感觉我不会用CSDN发帖发错地方了。

大家帮忙还是去看那个帖子吧

http://bbs.csdn.net/topics/391021913

时间: 2024-10-31 05:22:21

socket #-C#SOCKET长连接小数据程序未响应的相关文章

Win7系统Word程序未响应不想结束进程该怎么办

  Win7已经成为人们首选的主流操作系统,它以系统稳定著称,但是Win7在软件兼容性方面往往不及WinXP,比如大家在运行Word程序时就会发现经常编辑到一半时卡了,提示"应用程序没有响应",结束进程那么之前工作白做了,不结束干等着也不见它响应,碰到这种情况该如何处理呢? 状况一: 当你在Win7系统上,打开Word进行大批量文字处理时,而电脑内存使用率偏高,那么在文档编辑过程中,就会出现Word文档突然程序未响应问题,那么需要静待一会才可以恢复正常.因为电脑物理内存不足所导致的Wo

windows7出现程序未响应的解决方法

  很多win7用户都会经常遇到,在运行软件或打开文档会出现应用程序未响应的提示,那么出现这种问题我们应该如何解决呢?网络中给出了很多的解决方案,那么下面河东小编为大家提供一个详细的图文教程,来帮助用户解决此问题. 首先,打开"开始"菜单,打开"所有程序",进入"附件",点击"运行". 其次,打开运行在里面输入regedit运行注册表后点击确定. 接着,依次展开到HKEY_CURRENT_USERControl PanelDe

如何快速处理Win7系统程序未响应

  配置稍微低一点的电脑运行Win7系统经常会遇到程序未响应的情况,关也关不掉.一般情况下我们都是通过任务管理器来结束未响应进程,但是对于新手用户来说还是有点难度.下面系小编就为大家介绍一下如何快速处理Win7系统程序未响应. 1.我们可以自己创建一个小"工具"来解决这个问题,首先在桌面空白处鼠标右键,打开的右键菜单指向"新建",在子菜单单击"快捷方式"; 2.进入"创建快捷方式"向导,在对象的位置一栏下键入"tas

win7程序未响应怎么办?

  很多win7用户在使用时遇上程序未响应的问题,这到底是怎么回事,那么对于这个问题要怎么解决呢?今天小编就教大家怎么解决win7程序未响应的问题. 首先,打开"开始"菜单,打开"所有程序",进入"附件",点击"运行". 其次,打开运行在里面输入regedit运行注册表后点击确定. 接着,依次展开到HKEY_CURRENT_USERControl PanelDesktop,然后在空白处单击右键,新建一个"DWORD

怎样设置注册表可以使win7系统不出现“程序未响应”

  程序未响应,又是程序未响应...!曾多少时你是否有被这熟悉的5个字眼弄得切齿痛恨,这个问题是windows用户旧调重弹的问题了,关于这个问题出现的原因多种多样,处理的方法也是五花八门.要是在win7纯净版64位下载后遇到程序未响应该怎么办呢?其实很简略,这里小编为大家提供了一个简单的解决方法,那便是修改注册表来解决这个问题. 1.直接点击win+r组合键调出运行,在输入里面输入regedit字符,然后就开始运行注册表编辑器,再点击确定. 2.将下面的选项逐一展开:HKEY_CURRENT_U

win7系统程序未响应怎么办?

  很多win7用户碰到过这样的一个问题,就是提示说 "程序未响应"问题,而后程序就动不了啦!那么对于这个问题要怎么解决呢?现在一起去看看吧! 1.打开开始-所有程序-附件-运行. 2.打开运行在里面输入regedit运行注册表后点击确定. 3.依次展开到HKEY_CURRENT_USERControl PanelDesktop,然后在空白处单击右键,新建一个"DWORD 32位值". 4.然后重命名为 WaitToKillAppTimeout后双击文件再确认一下该

win7程序未响应故障解决办法

  win7系统很容易被卡住,这个问题应该使用win7系统的人都经常遇到的吧?甚至有的时候在使用浏览器的时候也会遇到程序未响应的情况,那么win7程序未响应怎么解决呢? 第一步,在菜单中找到附件选项,有的可能直接打开菜单就可以看到,有的也许要点击最下面的所有程序才可以看到! 单击附件之后,我们直接点击运行.或者说,我们可以直接按下"win+r"的快捷键打开运行窗口. 在运行窗口中输入regedit并回车确定,这个时候就会跳出来电脑的注册表编辑窗口. 接下来我们依次展开HKEY_CURR

win7出现程序未响应该怎么办

  不少用户都进行了win7旗舰版系统下载 ,不过在使用的时候可能会遇到各种各样的问题,比如说不少用户都反应自己遇到程序未响应,等了半天还是不见动静,于是就只好关闭网页,这可能会很耽误事.那么win7旗舰版64位纯净版出现程序未响应该怎么办呢? 1.打开电脑之后,将"开始"菜单打开,然后再双击打开"所有程序",进入"附件"选项,点击里面的"运行". 2.打开运行之后,在里面直接输进去regedit,这时候就可以运行注册表,再单

c#-C#程序未响应如何查看是哪一步死了?

问题描述 C#程序未响应如何查看是哪一步死了? 运行程序然后在界面操作程序不响应了,怎么知道程序运行到哪里死掉了? 解决方案 首先用断点来调试,假如进入不了断点的话,那就是可能在断点之前就已经抛出异常,但你没有捕获异常,致使程序结束而没有提示.我有次碰到界面没反应,也没提示,程序也没错,最后才发现是一个线程异常终止,但却没有捕获...希望对你有帮助! 解决方案二: 如果没有调试信息的输出,是不太可能能确定出错的位置的. 解决方案三: 你可以用断点来跟踪的 照你这个情况 应该是报错了 解决方案四: