最近要用C#写一段TCP通讯的代码,看了看MSDN,上网查了查资料,完整简单的异步通讯例子没有找到,大多数例子都是一写一读.自己查了查资料,写了个简单的测试例子,一方面供初学者参考,一方面也希望能够抛砖引玉.
原理就不细说了,直接看代码吧.
Form1.cs
using
System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
namespace TcpClientTest
... {
public partial class Form1 : Form
...{
public Form1()
...{
InitializeComponent();
}
TcpClient tcp = null;
NetworkStream workStream = null;
private enum DataMode ...{ Text, Hex }
private char[] HexDigits = ...{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'a', 'b', 'c', 'd', 'e', 'f' };
private bool CharInArray(char aChar, char[] charArray)
...{
return (Array.Exists<char>(charArray, delegate(char a) ...{ return a == aChar; }));
}
/**//// <summary>
/// 十六进制字符串转换字节数组
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
private byte[] HexStringToByteArray(string s)
...{
// s = s.Replace(" ", "");
StringBuilder sb = new StringBuilder(s.Length);
foreach (char aChar in s)
...{
if (CharInArray(aChar, HexDigits))
sb.Append(aChar);
}
s = sb.ToString();
int bufferlength;
if ((s.Length % 2) == 1)
bufferlength = s.Length / 2 + 1;
else bufferlength = s.Length / 2;
byte[] buffer = new byte[bufferlength];
for (int i = 0; i < bufferlength - 1; i++)
buffer[i] = (byte)Convert.ToByte(s.Substring(2 * i, 2), 16);
if (bufferlength > 0)
buffer[bufferlength - 1] = (byte)Convert.ToByte(s.Substring(2 * (bufferlength - 1), (s.Length % 2 == 1 ? 1 : 2)), 16);
return buffer;
}
/**//// <summary>
/// 字节数组转换十六进制字符串
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private string ByteArrayToHexString(byte[] data)
...{
StringBuilder sb = new StringBuilder(data.Length * 3);
foreach (byte b in data)
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
return sb.ToString().ToUpper();
}
/**//// <summary>
/// 当前接收模式
/// </summary>
private DataMode CurrentReceiveDataMode
...{
get
...{
return (chkHexReceive.Checked) ? DataMode.Hex : DataMode.Text;
}
set
...{
chkHexReceive.Checked = (value == DataMode.Text);
}
}
/**//// <summary>
/// 当前发送模式
/// </summary>
private DataMode CurrentSendDataMode
...{
get
...{
return (chkHexSend.Checked) ? DataMode.Hex : DataMode.Text;
}
set
...{
chkHexSend.Checked = (value == DataMode.Text);
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
namespace TcpClientTest
... {
public partial class Form1 : Form
...{
public Form1()
...{
InitializeComponent();
}
TcpClient tcp = null;
NetworkStream workStream = null;
private enum DataMode ...{ Text, Hex }
private char[] HexDigits = ...{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'a', 'b', 'c', 'd', 'e', 'f' };
private bool CharInArray(char aChar, char[] charArray)
...{
return (Array.Exists<char>(charArray, delegate(char a) ...{ return a == aChar; }));
}
/**//// <summary>
/// 十六进制字符串转换字节数组
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
private byte[] HexStringToByteArray(string s)
...{
// s = s.Replace(" ", "");
StringBuilder sb = new StringBuilder(s.Length);
foreach (char aChar in s)
...{
if (CharInArray(aChar, HexDigits))
sb.Append(aChar);
}
s = sb.ToString();
int bufferlength;
if ((s.Length % 2) == 1)
bufferlength = s.Length / 2 + 1;
else bufferlength = s.Length / 2;
byte[] buffer = new byte[bufferlength];
for (int i = 0; i < bufferlength - 1; i++)
buffer[i] = (byte)Convert.ToByte(s.Substring(2 * i, 2), 16);
if (bufferlength > 0)
buffer[bufferlength - 1] = (byte)Convert.ToByte(s.Substring(2 * (bufferlength - 1), (s.Length % 2 == 1 ? 1 : 2)), 16);
return buffer;
}
/**//// <summary>
/// 字节数组转换十六进制字符串
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private string ByteArrayToHexString(byte[] data)
...{
StringBuilder sb = new StringBuilder(data.Length * 3);
foreach (byte b in data)
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
return sb.ToString().ToUpper();
}
/**//// <summary>
/// 当前接收模式
/// </summary>
private DataMode CurrentReceiveDataMode
...{
get
...{
return (chkHexReceive.Checked) ? DataMode.Hex : DataMode.Text;
}
set
...{
chkHexReceive.Checked = (value == DataMode.Text);
}
}
/**//// <summary>
/// 当前发送模式
/// </summary>
private DataMode CurrentSendDataMode
...{
get
...{
return (chkHexSend.Checked) ? DataMode.Hex : DataMode.Text;
}
set
...{
chkHexSend.Checked = (value == DataMode.Text);
}
}