今天又写了一个。这个还算比较完美了 using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Net; using System.Net.Sockets; using System.Threading; using System.Reflection;namespace ConsoleApplication1 { public class Program { Thread[] SocketThreadList = new Thread[100]; static Socket TCPListen = null; static void Main(string[] args) { TCPListen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
如果这个程式的Threed已经开启了,哪么我再开启一次的时候就会报错,程式就会死掉。
如何防止当我再开程式,导致程式的死掉的方法啊?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
using System.Net;
using System.Net.Sockets;
namespace CSocket
{
public partial class Form1 : Form,IDisposable
{
public Form1()
{
InitializeComponent(); this.button3.Enabled = false;
} Socket socket = null; UdpClient m_client = null; Socket m_socket = null; bool BeginDisconnection = false; IPAddress ipaddress = IPAddress.Parse("127.0.0.1"); private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(BeginListening)); thread.Start(); BeginDisconnection = false; this.button1.Enabled = false; this.button3.Enabled = true;
} private void button2_Click(object sender, EventArgs e)
{
SendMessage(this.textBox2.Text);
}
[STAThread]
private void BeginListening()
{
try
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipPort = new IPEndPoint(ipaddress, 13000); socket.Bind(ipPort); socket.Listen(0); this.textBox1.Text += "开始绑定并启用Socket..\r\n"; while (!BeginDisconnection)
{
Socket handler = socket.Accept(); byte[] bytes = new byte[1024]; int bytesRec = handler.Receive(bytes); string m_String = Encoding.Default.GetString(bytes); IPEndPoint ipPoint = (IPEndPoint)handler.RemoteEndPoint; handler.Shutdown(SocketShutdown.Both);//停止接收信息 handler.Disconnect(true); handler.Close(); if (m_String.IndexOf("<EOF>") > -1)
{ socket.Close(); BeginDisconnection = false; this.textBox1.Text += "\r\n成功关闭Socket连接..\r\n"; this.button1.Enabled = true; break;
}
else { this.textBox1.Text += "\r\n" + ipPoint.Address.ToString() + ":" + ipPoint.Port.ToString() + ":" + m_String; } Thread.Sleep(100);
}
}
catch (SocketException se) { MessageBox.Show(se.Message); }
catch (Exception ex) { MessageBox.Show(ex.Message); }
} private void button3_Click(object sender, EventArgs e)
{
SendMessage("<EOF>");
} //发送消息
private void SendMessage(string s)
{
try
{
m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp); IPEndPoint ipPort = new IPEndPoint(ipaddress, 13000); m_socket.Connect(ipPort); byte[] bytes = Encoding.Default.GetBytes(s); m_socket.Send(bytes); m_socket.Shutdown(SocketShutdown.Both); m_socket.Close();
}
catch (ArgumentException ae) { this.textBox1.Text += ae.Message + "\r\n"; }
catch (SocketException se) { this.textBox1.Text += se.Message + "\r\n"; }
catch (Exception ex) { this.textBox1.Text += ex.Message + "\r\n"; }
} private void button4_Click(object sender, EventArgs e)
{
try
{
m_client = new UdpClient(); IPEndPoint s_IP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 13000); m_client.Connect(s_IP); m_client.Send(Encoding.Default.GetBytes(this.textBox2.Text), Encoding.Default.GetBytes(this.textBox2.Text).Length); m_client.Close();
}
catch (ArgumentException ae) { this.textBox1.Text += ae.Message + "\r\n"; }
catch (SocketException se) { this.textBox1.Text += se.Message + "\r\n"; }
catch (Exception ex) { this.textBox1.Text += ex.Message + "\r\n"; }
}
}
}
bool IsBeginListen=false;2:BeginListen函数内,修改该全局变量。
BeginListen()
{
.........
IsBeginListen=true;
...........
}3:启动线程的时候,判断该变量:if(IsBeginListen=true)
{
Thread re = new Thread(new ThreadStart(BeginListen));
re.IsBackground = true;
re.Start();
}
if(IsBeginListen==true)
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Reflection;namespace ConsoleApplication1
{
public class Program
{
Thread[] SocketThreadList = new Thread[100]; static Socket TCPListen = null; static void Main(string[] args)
{
TCPListen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint LocalPort = new IPEndPoint(IPAddress.Any, 55000); TCPListen.Bind(LocalPort); TCPListen.Listen(100); Thread AcceptThread = new Thread(new ThreadStart(AcceptWorkThread)); AcceptThread.Start(); Console.WriteLine("****** 软创通信服务器程序 ******"); Console.WriteLine(string.Format("开始监听 <{0}>", LocalPort)); Console.WriteLine("单击回车键退出SOCKET"); Console.ReadLine(); GC.Collect(); GC.WaitForPendingFinalizers();
} // 接收连接线程
[STAThread]
static void AcceptWorkThread()
{
// 指示为后台线程
Thread.CurrentThread.IsBackground = true; while (true)
{
// 为新建连接创建新的Socket实例
Socket s_Accept = TCPListen.Accept(); IPEndPoint remoteAddress = (IPEndPoint)s_Accept.RemoteEndPoint; Console.WriteLine(string.Format("接收到来自 {0} 的连接", remoteAddress)); // 接收数据专用线程 Thread ReceiveThread = new Thread(new ParameterizedThreadStart(ReceiveWorkThread)); ReceiveThread.Start(s_Accept); Thread.Sleep(100);
}
} static void ReceiveWorkThread(object obj)
{
Thread.CurrentThread.IsBackground = true; // 标识后台线程 Socket s_Receive = (Socket)obj; byte[] buffer = new byte[1024]; // 创建接收缓冲 IPEndPoint remoteAddress = (IPEndPoint)s_Receive.RemoteEndPoint; try
{
while (s_Receive.Connected)
{
if (s_Receive.Connected)
{ int ReceiveCount = s_Receive.Receive(buffer); Console.WriteLine(string.Format("{0}:{1}", remoteAddress, Encoding.Default.GetString(buffer))); // 返回接收成功数据
s_Receive.Send(Encoding.Default.GetBytes("AAA")); Thread.Sleep(100);
}
else { s_Receive.Close(); break; }
}
}
catch { Console.WriteLine(string.Format("{0} 断开连接", remoteAddress)); }
}
}
}