您的位置:首页 > 理论基础 > 计算机网络

关于C#多线程、网络编程与计时器Timer的一点使用心得

2012-08-09 15:47 841 查看
初次使用C#进行网络编程,其中用到了多线程与计时器Timer类,以及网络通信相关类,在此总结一下。

功能:服务器启动后一直处于侦听状态,一旦有客户发送数据就显示在文本框中,期间可以对侦听进行停止和启动操作。

1、服务器部分界面与代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;               // 引入这两个命名空间,以下同
using System.Net.Sockets;
using System.Threading;
using System.IO;
namespace Servers
{
public partial class FrmServer : Form
{
Thread listenThread;//侦听线程
StringBuilder msgs = new StringBuilder();

public FrmServer()
{
InitializeComponent();
}

private void FrmServer_Load(object sender, EventArgs e)
{
listenThread = new Thread(IPScan);
listenThread.IsBackground = true;
}

//开始侦听
private void btnStartListen_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
timer1.Start();
btnStartListen.Enabled = false;
btnStopListen.Enabled = true;

//如果需要多次挂起和启动线程,需要加以判断调用合适的方法
if (listenThread.ThreadState == ThreadState.Suspended ||
(listenThread.ThreadState == (ThreadState.SuspendRequested | ThreadState.Background)))
{
listenThread.Resume();
}
else
{
listenThread.Start();
}
}

/// <summary>
/// 侦听线程
/// </summary>
void IPScan()
{
IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });
TcpListener listener = new TcpListener(ip, 8500);

listener.Start();           // 开始侦听

const int BufferSize = 8192;    // 缓存大小,8192字节
byte[] buffer = new byte[BufferSize];
int bytesRead;
string msg;

TcpClient remoteClient;
NetworkStream streamToClient;

while (true)//连续侦听
{
try
{
// 获取一个连接,中断方法
remoteClient = listener.AcceptTcpClient();
// 获得流,并写入buffer中
streamToClient = remoteClient.GetStream();

bytesRead = streamToClient.Read(buffer, 0, BufferSize);

// 获得请求的字符串
msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
msgs.AppendLine(msg);
Array.Clear(buffer, 0, bytesRead);

Thread.Sleep(1000);
#region 反馈结果给客户
//可以在此进行其他相关处理
byte[] result = Encoding.Unicode.GetBytes("你好啊,兄弟!");
streamToClient.Write(result, 0, result.Length);
#endregion
}
catch (IOException ioe)
{
;//处理异常
}
catch (Exception ex)
{
;//处理异常
}
}
/*如果套接字是在子线程中创建的,那么在线程停止时(进入Stopped状态),
* 应该同步停止侦听的连接,否则,下次使用同样的套接字侦听时会报错。*/
listener.Stop();
}

private void timer1_Tick(object sender, EventArgs e)
{
textBox1.Text = msgs.ToString();
}

//停止侦听
private void btnStopListen_Click(object sender, EventArgs e)
{
listenThread.Suspend();
timer1.Enabled = false;
btnStartListen.Enabled = true;
btnStopListen.Enabled = false;
}
}
}


2、客户端部分界面与代码

客户端做的比较简陋,惭愧。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;               // 引入这两个命名空间,以下同
using System.Net.Sockets;
using System.Threading;
namespace CommonClients
{
public partial class v : Form
{
public v()
{
InitializeComponent();
}

private void btnSendData_Click(object sender, EventArgs e)
{
TcpClient client = new TcpClient();
try
{
client.Connect("127.0.0.1", 8500);      // 与服务器连接
string msg = textBox1.Text;
NetworkStream streamToServer = client.GetStream();

byte[] buffer = Encoding.Unicode.GetBytes(msg);     // 获得缓存
streamToServer.Write(buffer, 0, buffer.Length);     // 发往服务器
Thread.Sleep(3000);
#region 从服务器接收反馈结果
byte[] receiveBuf=new byte[1024];//接收缓冲区
int bytesRead = streamToServer.Read(receiveBuf, 0, 1024);
string msgRead = Encoding.Unicode.GetString(receiveBuf, 0, bytesRead);
textBox2.Text = msgRead;
#endregion
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return;
}
}
}
}



总结:有关多线程、网络编程的知识还有很多没有涉及,以后慢慢完善。




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