【摘要】 最近有个小项目,需要调用装置的录波数据,使用tcp模式,在这里整理了下如何使用c#实现tcp连接并实现发送接收数据,分享出来。 我这里使用的tcpclient ,终端是tcpserver模式。 首先自定义一个类 clientsocket class clientsocket //tcp客户端的类 增加一个client104类 { public Socket new…
最近有个小项目,需要调用装置的录波数据,使用tcp模式,在这里整理了下如何使用c#实现tcp连接并实现发送接收数据,分享出来。
我这里使用的tcpclient ,终端是tcpserver模式。
首先自定义一个类 clientsocket
class clientsocket //tcp客户端的类 增加一个client104类
{
public Socket newclient;
public bool Connected;
public Thread myThread;
public delegate void MyInvoke(string str);
public string send_str,receive_str;//发送字符串,接收字符串
public string stringdata=””;
public int hexflag=1; //十六进制标志
public int sendlen = 0; //发送长度,用户每次发送的字节个数使用
private StringBuilder builder = new StringBuilder();
public byte[] buffer = new byte[4096];
public List<byte> data = new List<byte>();
/// <summary>
/// connect 网络连接
/// </summary>
/// <param name=”ipadd”></param>
/// <param name=”port”></param>
#region 连接ip,端口号
public void Connect(string ipadd, int port)
{
byte[] data = new byte[1024];
newclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ie = new IPEndPoint(IPAddress.Parse(ipadd), port);
try
{
newclient.Connect(ie);
Connected = true;
}
catch
{
Connected = false;
return;
}
ThreadStart myThreaddelegate = new ThreadStart(Receivestr);
myThread = new Thread(myThreaddelegate);
myThread.Start();
}
#endregion
#region 写log文件
public int writeLogFile(string str)
{
string filePath = AppDomain.CurrentDomain.BaseDirectory + @”\run.log”;
if (File.Exists(filePath))
{
FileInfo fileInfo = new FileInfo(filePath);
if (fileInfo.Length > 2000000)
File.Delete(filePath);
}
FileStream aFile = new FileStream(filePath, FileMode.OpenOrCreate | FileMode.Append);
StreamWriter sw = new StreamWriter(aFile);
DateTime tt = DateTime.Now;
str = “[” + tt.ToString() + “] ” + str;
sw.WriteLine(str);
sw.Close();
aFile.Close();
return 1;
}
#endregion
/// <summary>
/// receivestr 接收字符串
/// </summary>
#region 接收数据
public void Receivestr()
{
receive_str = “”;
stringdata = “”;
int recv=0;
while (true)
{
if (!Connected) return;
try
{
recv = newclient.Receive(buffer);
for (int i = 0; i < recv; i++)
{
data.Add(buffer[i]);
receive_str += data[i].ToString(“X2”);
}
stringdata = Encoding.UTF8.GetString(buffer, 0, recv);
}
catch
{
return;
}
}
}
#endregion
/// <summary>
/// sendstr 发送字符串
/// </summary>
/// <param name=”str”></param>
/// <param name=”hexflag”></param>
#region 发送数据
public void sendstr(string str,int hexflag)
{
if (!Connected) return;
int m_length = str.Length/2;
byte[] data = new byte[m_length];
if (hexflag == 0)
{
data = Encoding.UTF8.GetBytes(str);
}
else
{
int len = strtohexarray(str, data);
}
try
{
sendlen = newclient.Send(data);
}
catch
{
Connected = false;
}
}
#endregion
/// <summary>
/// close 关闭网络
/// </summary>
#region 关闭
public void close()
{
if (Connected)
{
newclient.Close();
}
}
#endregion
/// <summary>
/// strtohexarray 将字符串转换成byte[]
/// </summary>
/// <param name=”str”></param>
/// <param name=”b”></param>
/// <returns></returns>
#region
public int strtohexarray(string str,byte[] b)
{
int i = 0;
if (str.Length % 2 != 0)
str = str.Substring(0, str.Length – 1);
for (i = 0; i < str.Length / 2; i++)
{
b[i] = System.Convert.ToByte(str.Substring(i * 2, 2), 16);
}
return i;
}
#endregion
}
在界面上首先需要输入ip地址=IP.Text ,端口号=ports
声明类
clientsocket csocket;//tcp 类
单击连接的时候 使用csocket.Connect(IP.Text,ports);
发送数据:
if(csocket.Connected)
csocket.sendstr(send_str,0);//发送字符串
因为我这里是少量数据接收,并且只有发送数据后,终端才返回数据,所以我就简单的用定时来实现的。
private void timer1_Tick(object sender, EventArgs e)
{
string returnstr = “”;
if (csocket == null)
return;
if (csocket.Connected)
{
if (csocket.receive_str.Length > 0)
{
returnstr = csocket.stringdata;
//解释数据
explain_data();
}
}
}
如果要完全实现自动化,还是建议使用线程模式,当连接成功后启动线程一致接收就可以了
以上是我的一个实现过程;
欢迎关注、点赞、转发!!!
文章来源: blog.csdn.net,作者:Six-Classics-note-Me,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/mainmaster/article/details/116045896