初次使用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; } } } }
总结:有关多线程、网络编程的知识还有很多没有涉及,以后慢慢完善。