xtsyk 2014-12-31 02:06 采纳率: 0%
浏览 3348

我写的socket监听过一段时间就需要重新启动一下程序是什么原因

private void StartReceive()
{
string msg = null;

        IPEndPoint iep = new IPEndPoint(IPAddress.Parse(PublicVariables.BJIP), PublicVariables.PORT);
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        socket.Bind(iep);
        socket.Listen(PublicVariables.JTS);
        Socket newSocket;
        while (true)
        {
            try
            {

                newSocket = socket.Accept();
                byte[] byteMessage = new byte[1024 * 1024];
                int js = 1;
                js = newSocket.Receive(byteMessage, byteMessage.Length, 0);
                Console.WriteLine(js);

                msg = Encoding.UTF8.GetString(byteMessage);
                msg = msg.Replace("\0", "");
                PostGetData pgd = new PostGetData();
                string cz = msg.Substring(0, 4);
                if (cz.Equals("gxsj"))
                {
                    NetworkStream stream = new NetworkStream(newSocket);
                    bool result = pgd.SendFile("caipu.db3", stream);
                    stream.Close();
                    newSocket.Dispose();
                    msg = null;
                }
                else if (cz.Equals("gkkt"))
                {
                    string ctInfo = null;
                    byte[] bytes = null;
                    ctInfo = pgd.GetCtInfo();
                    bytes = new byte[1024 * 1024];
                    bytes = Encoding.UTF8.GetBytes(ctInfo);
                    newSocket.Send(bytes);
                    //newSocket.Close();
                    newSocket.Dispose();
                    msg = null;
                }
                else if (cz.Equals("gxtp"))
                {
                    NetworkStream stream = new NetworkStream(newSocket);
                    bool result = pgd.FsFile("image.zip", stream);
                    stream.Close();
                    newSocket.Close();
                    newSocket.Dispose();
                    msg = null;
                }
                else if (cz.Equals("gkdc"))
                {
                    string data = msg.Substring(6);
                    Regex regex = new Regex("<<");
                    string[] strs = regex.Split(data);
                    SqlHelper helper = new SqlHelper();
                    byte[] bytes = new byte[1024 * 1024];
                    try
                    {
                        string result = helper.Gkdc(strs);
                        bytes = Encoding.UTF8.GetBytes(result);
                        if (newSocket.Connected)
                        {
                            newSocket.Send(bytes);
                        }

                        newSocket.Dispose();
                        msg = null;
                    }
                    catch
                    {
                        bytes = Encoding.UTF8.GetBytes("error");
                        if (newSocket.Connected)
                        {
                            newSocket.Send(bytes);
                        }

                        newSocket.Dispose();
                        msg = null;
                        continue;
                    }

                }
                else if (cz.Equals("ckxf"))
                {
                    string[] strs = msg.Split('@');
                    string str = strs[0].Substring(6);
                    SqlHelper helper = new SqlHelper();
                    string result = helper.ckxf(str);
                    NetworkStream stream = new NetworkStream(newSocket);
                    bool results = pgd.FsFile(str + ".log", stream);
                    stream.Close();
                    newSocket.Dispose();
                    msg = null;
                }
                else if (cz.Equals("gqcp"))
                {
                    SqlHelper helper = new SqlHelper();
                    List<string> lists = helper.gqcp();
                    TxtFileManager tfm = new TxtFileManager();
                    tfm.DelFile("gqcp.log");
                    if (lists.Count > 0)
                    {
                        for (int i = 0; i < lists.Count; i++)
                        {
                            tfm.Write("gqcp.log", lists[i].ToString());
                        }
                    }
                    else
                    {
                        tfm.Write("gqcp.log", "null");
                    }
                    NetworkStream stream = new NetworkStream(newSocket);
                    bool results = pgd.FsFile("gqcp.log", stream);
                    stream.Close();
                    newSocket.Dispose();
                    msg = null;
                }
                else if (cz.Equals("tcsl"))
                {
                    string data = msg.Substring(6);
                    Regex regex = new Regex("<<");
                    string[] strs = regex.Split(data);
                    SqlHelper helper = new SqlHelper();
                    string result = helper.GetTcsl(strs[0], strs[1], strs[2]);
                    byte[] bytes = new byte[1024 * 1024];
                    bytes = Encoding.UTF8.GetBytes(result);
                    newSocket.Send(bytes);
                    newSocket.Dispose();
                    msg = null;
                }
                else if (cz.Equals("gktc"))
                {
                    string data = msg.Substring(6);
                    Regex regex = new Regex("<<");
                    string[] strs = regex.Split(data);
                    SqlHelper helper = new SqlHelper();
                    string result = helper.Gktc(strs);
                    byte[] bytes = new byte[1024 * 1024];
                    bytes = Encoding.UTF8.GetBytes(result);
                    newSocket.Send(bytes);
                    newSocket.Dispose();
                    msg = null;
                }
            }
            catch (Exception ex)
            {
                TxtFileManager tfm = new TxtFileManager();
                tfm.Write("sys.log", ex.ToString() + "  " + DateTime.Now.ToString());
                continue;
            }
        }
    }
  • 写回答

2条回答 默认 最新

  • Landpack 2014-12-31 04:22
    关注

    有可能是因为你退出你的socket服务端的时候,端口仍然被占用,在linux系统下,有时候你即使调用kill杀死进程后,端口仍然被占用。
    这总情况下,你再次启动你的服务端程序将无法正常运行。当你重启后,所有系统占用都被释放,以及上次bind()过的端口。
    因此,当你无法正常运行时,修改一个端口即可,(记住客户端要与服务端保持一致,要修改,都需要修改)
    希望对你有用!

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)