1.本文利用微软提供的TCPClient 控件以及NetworkStream 流操作的思想,花了一个周末的时间终于调试完成了TCP客户端发送和接收数据的基本通讯功能(基于ASCII码或者unicode码)。之前用c++写的时候花了一个多礼拜,本人是菜鸟水平,供各位参考!
2.由于时间有限,groupbox的重绘以及port端口自动获取等功能尚未实现。
3.TCP server部分将会在后期补上。
4.废话不多说直接上部分源码:
发送数据:
public void SendDatatoServer(string str_data)
{
if (isConnnectServer)
{
if (str_data != "")
{
try
{
Byte[] sendBytes = Encoding.ASCII.GetBytes(str_data);
networkStream.Write(sendBytes, 0, sendBytes.Length);
}
catch
{
MsgWindow.Text = "SendDatatoServer Error!";
}
}
}
}
public string ReceiveDatafromServer()
{
string returndata="未与服务器连接";
if (isConnnectServer)
{
byte[] bytes = new byte[tcpClient.ReceiveBufferSize];
try
{
int BytesRead = networkStream.Read(bytes, 0, (int)tcpClient.ReceiveBufferSize);
returndata = Encoding.ASCII.GetString(bytes, 0, BytesRead);
//if (returndata == "")//
if (BytesRead==0)
{
receiveBlankCount++;
returndata = "receiveBlankCount="+receiveBlankCount.ToString();
}
if(receiveBlankCount>receiveBlankMaxNum)
{
receiveBlankCount = 0;
isConnnectServer = false;
returndata = str_disconnect;
}
//returndata = Encoding.Unicode.GetString(bytes, 0, BytesRead);
}
catch
{
returndata = "读取缓冲区失败,可能与服务器断开连接!";
isConnnectServer = false;
}
}
return returndata;
}
线程部分:(开通了线程接收数据舍弃了定时器的方式,界面不会出现卡顿的情况)
public delegate void UpdateTxt(string received_data); //创建一个委托,为访问textbox控件TCP_ReceiveWindow
public UpdateTxt updateTxt; //定义一个委托变量
public void UpdateTxtMethod(string received_data)//更新控件TCP_ReceiveWindow的方法
{
TCP_ReceiveWindow.AppendText(received_data + "\r\n");
TCP_ReceiveWindow.ScrollToCaret();
}
//此为在非创建线程中的调用方法,其实是使用TextBox的Invoke方法。
public void ThreadMethodTxt()
{
while (isConnnectServer)
{
this.BeginInvoke(updateTxt, ReceiveDatafromServer());
Thread.Sleep(100);
}
//this.MsgWindow.Text = "与服务器断开连接!";
}
private void Form1_Load(object sender, EventArgs e)
{
//实例化委托
updateTxt = new UpdateTxt(UpdateTxtMethod);
}
private void button3_Click(object sender, EventArgs e)
{
if (!isConnnectServer)
{
ConnectServer(ServerIPInput.Text, ServerPortInput.Text);
Thread objThread = new Thread(new ThreadStart(delegate
{
ThreadMethodTxt();
}));
objThread.Start();
}
else
{
MsgWindow.Text = "已连接服务器,请断开后重连!";
}
//TCPClientReceiveThread.Start();
//timer1.Enabled = true;
}
参考源码:http://download.csdn.net/detail/ericwuhk/9695976
参考网址(C# 获得本机IP、端口等信息地址以及服务器IP信息):
http://254698001.blog.51cto.com/2521548/768124/
最终界面如下:
调试工具助手: