// 启动线程 启动监听按钮
private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(handleSc));
th.IsBackground = true;
th.Start();
}
private void handleSc()
{
int port = 8080;
port = System.Convert.ToInt32(strSPort);
string hostIp = "127.0.0.1";
hostIp = textBox4.Text;
IPAddress ip = IPAddress.Parse(hostIp);
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket recvSocket = null;
Socket sS = null;
while (true)
{
try
{
// 创建一个Socket类
sS = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 绑定端口
sS.Bind(ipe);
sS.ReceiveTimeout = INT_TIMEOUT;
// 开始监听
sS.Listen(0);
// 为新建连接创建新的Socket
recvSocket = sS.Accept();
............
}
catch(...)
{
.....
}
}
}
我想在用再拉一个按钮做一个停止监听按钮,实现可以启动监听 又可以停止监听的东西。请各位大虾给出代码 谢谢! 希望不要嫌分少了啊 呵呵
我的建议:
1、用TcpListener 作为Socket的产生器,监听端口并将之设为全局变量(可以方便的停止监听)
2、handleSc() 中异步启动监听器,产生TcpClient并”再次“异步执行连接处理数据等操作。
3、如非必要尽量不要另开线程,开销过大。可以用异步即线程池。
参考:
TcpListener listener = new TcpListener(ip, LisenPort);
static void main()
{
Action act=new Action(beginStartService);
act.lisner.BeginInvoke(lisnerCallback, null);
}
private void beginStartService()
{
IPAddress ip = getHostInfo.getIPAddressV4();
listener = new TcpListener(ip, LisenPort);
try
{
listener.Start();
}
catch (Exception ee)
{
MessageBox.Show("没有开始监听,请更改配置后重启程序。"+ee.Message);
return;
}
while (true)
{
TcpClient client=listener.AcceptTcpClient();
//transmissionTaskClass 这是我自己的类不要深究
transmissionTaskClass cc = new transmissionTaskClass(client);
//异步传输数据
cc.beginServerStart();
}
}
//回调函数
private void lisnerCallback(IAsyncResult ar)
{
}
将socket提取成全局变量,然后在一个button事件中去关闭socket就好了。