关于C#多线程、网络编程与计时器Timer的一点使用心得
2012-08-09 15:47
841 查看
初次使用C#进行网络编程,其中用到了多线程与计时器Timer类,以及网络通信相关类,在此总结一下。
功能:服务器启动后一直处于侦听状态,一旦有客户发送数据就显示在文本框中,期间可以对侦听进行停止和启动操作。
1、服务器部分界面与代码
2、客户端部分界面与代码
客户端做的比较简陋,惭愧。
总结:有关多线程、网络编程的知识还有很多没有涉及,以后慢慢完善。
功能:服务器启动后一直处于侦听状态,一旦有客户发送数据就显示在文本框中,期间可以对侦听进行停止和启动操作。
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; } } } }
总结:有关多线程、网络编程的知识还有很多没有涉及,以后慢慢完善。
相关文章推荐
- C#关于"该进程无法访问文件,因为该文件正由另一进程使用"的错误的一点心得(示例)
- 关于三层结构的一点使用心得与开发建议
- 关于USB-AUDIO使用ALSA编程的一点问题
- 关于C#多线程的学习和一点疑惑
- 关于使用Javascript来模拟多线程的一点想法
- 关于.net的combobox的一点使用心得
- [转]在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(二)
- C# 多线程编程之线程池的使用 (ThreadPool)
- 关于JavaScript的一点使用心得。
- 关于水晶报表使用的一点心得
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(二)----使用方法
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架
- 关于RemoteCallbackList的使用的一点心得
- 网络编程中设计并发服务器,使用多进程与多线程有什么区别?
- 浅谈C# Socket编程及C#如何使用多线程
- C#网络编程(二)------多线程socket实例
- 关于exe形式编程的一点心得,希望对大家有所帮助
- Unity 关于CombineMeshes的一点使用心得
- [转]在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)
- 5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task