您的位置:首页 > 编程语言 > C#

c#多线程socket开发

2011-07-25 15:26 176 查看
话说“主机已经强制性关闭一个链接”这个问题一直拖延了很久,现在解决了,贴出来希望能购有所参考

using System;
using System.Collections;
using System.Collections.Specialized;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Data;
using System.Windows.Forms;
using System.Configuration;
using Microsoft.Win32;
using System.Diagnostics;
using System.Timers;

namespace WSGPSGateway
{
    public partial class TcpServer : Form
    {
        public TcpServer()
        {
            InitializeComponent();
        }

        #region 自定义字段

        public static ManualResetEvent allDone = new ManualResetEvent(false);

        /// <summary>
        /// 监听控件开启状态
        /// </summary>
        private bool State = true;

        /// <summary>
        /// 声明一个线程实例
        /// </summary>
        private Thread mythread;

        /// <summary>
        /// 服务器端Ip
        /// </summary>
        private int _port = Convert.ToInt32(ConfigurationManager.AppSettings["Port"]);

        /// <summary>
        /// 保存客户端所有回话的哈希表
        /// </summary>
        private Hashtable _transmit_tb = new Hashtable();

        /// <summary>
        /// 用于接受消息的线程
        /// </summary>
        private Thread _receviccethread = null;

        public struct TCPParameter
        {
            public string Package;
            public string IpAddress;
        }

        #endregion

        #region 监听代码块

        //窗体运行
        private void TcpServer_Load(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Minimized;
            this.Opacity = 0; // 窗体透明度  
            Form.CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            mythread = new Thread(Listen);
            mythread.Start();

            System.Timers.Timer atimer = new System.Timers.Timer();
            atimer.Elapsed += new System.Timers.ElapsedEventHandler(TimeEvent);
            atimer.Interval = 1000;
            atimer.Enabled = true;
            GC.KeepAlive(atimer); 
        }

        private object threadlock = new object();

        //启动监听
        private void BtnStart_Click(object sender, EventArgs e)
        {
            //多线程
        }

        //启动监听,轮询监听客户机请求并将客户端套接字存入转发表
        private void Listen()
        {
            try
            {
                IPAddress _ip = IPAddress.Any;
                Socket newsoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                newsoc.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                IPEndPoint locaEp = new IPEndPoint(IPAddress.Any, _port);//建立连接           
                newsoc.Bind(locaEp);
                newsoc.Listen(100);
                allDone.Reset();
                newsoc.BeginAccept(new AsyncCallback(onCall), newsoc);//继续接受其他客户端的连接 
                allDone.WaitOne();
            }
            catch (Exception ex)
            {
               //
            }
        }

        //监听回调
        private void onCall(IAsyncResult ar)
        {
            allDone.Set();
            Socket serverSoc = (Socket)ar.AsyncState;
            Socket clent = serverSoc.EndAccept(ar);
            try
            {
                if (serverSoc != null)
                {
                    byte[] comes = new byte[1024];
                    EndPoint enp = clent.RemoteEndPoint;
                    serverSoc.BeginAccept(new AsyncCallback(onCall), serverSoc);
                    while (true)
                    {
                        int re = clent.Receive(comes, comes.Length, 0);
                        clent.Send(Encoding.ASCII.GetBytes("8"));
                        TCPParameter parm = new TCPParameter();
                        parm.Package = Encoding.UTF8.GetString(comes, 0, re).ToString().Trim();
                        parm.IpAddress = clent.RemoteEndPoint.ToString();
                        if (parm.Package.Length != 0)
                        {
                            Receive(parm.Package, parm.IpAddress);
                        }
                    }
                }
            }
            catch (SocketException ex)
            {
               //
            }
        }

        //处理解析数据
        private void Receive(string msg, string ip)
        {
           //
        }

        #endregion

        #region 关闭与退出

        //窗体关闭
        private void TcpServer_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (mythread != null)
            {
                mythread.Interrupt();
                mythread.Abort();
                GC.Collect();
            }
        }

        #endregion
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: