读书人

浅谈C# Socket编程及C#怎么使用多线程

发布时间: 2012-11-22 00:16:41 作者: rapoo

浅谈C# Socket编程及C#如何使用多线程
??????????????????? rtbTalk.AppendText(msg+"\n");??????? //显示在文本控件里
??????????????? }
??????????????? catch (SocketException se)??????????????//捕捉异常,
??????????????? {
??????????????????? lbState.Text = se.ToString();???????//将其显示出来, 在此亦可以自定义错误.
??????????????? }
??????????? }
??????? }

??????? private void btConnect_Click(object sender, EventArgs e)???//连接按钮触发的事件: 连接Server
??????? {
??????????? btConnect.Enabled = false;
??????????? btStopConnect.Enabled = true;
??????????? try
??????????? {
??????????????? th = new Thread(new ThreadStart(BeginListen));??????????//创建一个新的线程专门用于处理监听,这句话可以分开写的,比如: ThreadStart ts=new ThreadStart(BeginListen); th=new Thread (ts); 不过要注意, ThreadStart的构造函数的参数一定要是无参数的函数. 在此函数名其实就是其指针, 这里是委托吗?
??????????????? th.Start();????????????????????????????//启动线程
??????????????? lbState.Text = "Listenning...";
??????????? }
??????????? catch (SocketException se)?????????? //处理异常
??????????? {
??????????????? MessageBox.Show(se.Message, "出现问题", MessageBoxButtons.OK, MessageBoxIcon.Information);
??????????? }
??????????? catch (ArgumentNullException ae)?? //参数为空异常
??????????? {
??????????????? lbState.Text = "参数错误";
??????????????? MessageBox.Show(ae.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Warning);
??????????? }

??????? }

??????? private void btStopConnect_Click(object sender, EventArgs e)??//停止监听
??????? {
??????????? btStopConnect.Enabled = false;
??????????? btConnect.Enabled = true;
??????????? sock.Close();?????????????????????//关闭套接字
??????????? th.Abort();?????????????????????????//终止监听线程
???????????
?????????? lbState.Text = "Listenning stopped";
??????? }

??????? private void btExit_Click(object sender, EventArgs e)???????
??????? {
??????????? sock.Close();
??????????? th.Abort();
??????????? Dispose();?????????????//清理资源,就是释放内存
??????????? this.Close();??????????//关闭对话框, 退出程序
??????? }

??????? private void btSend_Click(object sender, EventArgs e)
??????? {
??????????? try
??????????? {
??????????????? IPAddress clientIp = IPAddress.Parse(tbTargetIp.Text);????//类IPAddress的静态函数Parse() :将Text转化为IPAddress的一个实例.
??????????????? int clientPort = Convert.ToInt32(tbPort.Text);?????????????????//C#的这些转化函数很方便的,不像C++那样麻烦
??????????????? IPEndPoint clientIep = new IPEndPoint(clientIp, clientPort);?????//这里用client表示不是很好....,
??????????????? Byte[] byte_Message;
??????????????? Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);????????????实例化的时候还有很多参数的, 这个是Tcp的. Tcp的SocketType是Stream:数据流, 如果协议类型是UDP, 则是数据包传送, QQ就是用的UDP.
??????????????? socket.Connect(clientIep); //Socket的又一个函数Connect(IPEndPoint) .连接远程套接字
??????????????? byte_Message = System.Text.Encoding.UTF8.GetBytes(rtbWords.Text); //发现UTF8可支持中文,就用之
??????????????? socket.Send(byte_Message);
??????????????? rtbTalk.AppendText("\n"+"My words:" + rtbWords.Text + "\n");
??????????????? socket.Shutdown(SocketShutdown.Both);
??????????????? socket.Close();
??????????? }
??????????? catch (ArgumentNullException ae)
??????????? {
??????????????? MessageBox.Show(ae.Message,"参数为空",MessageBoxButtons.OKCancel,MessageBoxIcon.Information);
??????????? }
??????????? catch (SocketException se)
??????????? {
??????????????? MessageBox.Show(se.Message, "出现问题", MessageBoxButtons.OK, MessageBoxIcon.Information);
??????????? }
??????? }
??????
??? }
}

Program.cs

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace OnlySocket
{
??? static class Program
??? {
??????? /// <summary>
??????? /// 应用程序的主入口点。
??????? /// </summary>
??????? [STAThread]
??????? static void Main()????????//这儿才是main函数

??????? {
??????????? Application.EnableVisualStyles();
??????????? Application.SetCompatibleTextRenderingDefault(false);
??????????? Application.Run(new Form1());
??????? }
??? }
}

写了半天了, 够累的了, 虽然都是很基础的东西, 我自己写的时候也复习了一边 , 呵呵.

其实多线程我自己也不是很熟练, 记得去年暑假写过一个多线程扫描器, 也不知为啥, 线程开到50以上就异常, 很郁闷的. 其实当时我就是用的new Thread=Thread(new ThreadStart(Fun))实现的, 方法感觉很笨拙,呵呵.

大致代码好像是这样的吧:

先写个Scan类:

public class Scan

{

try{ public Scan(){?? ...Init...?? }

??????????? public void Scan{ ..task循环扫描... } //task结构体里面有IP, 端口, 是否已扫描标记fLag}

catch{}

}

然后主函数里面可以这样搞:

Scan[] scanner = new Scan[XX]

Thread[] thread = new Thread[XX];
??????????? for (int i = 0; i < XX;i++)
??????????? {
??????????????? scanner[i] = new Scan(this, i);
??????????????? thread[i] = new Thread(new ThreadStart(scanner[i].StartScan));
??????????????? thread[i].Start();

??????????? }

其实这样就可以简单的实现多线程了.

读书人网 >编程

热点推荐