C#学习笔记——TCP通讯
服务端:TcpListener
客户端:TcpClient、NetworkStream
(要熟悉的类,请参照MSDN。)
TCP客户端:
界面:
代码:
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;
using System.Net.Sockets;
using System.Threading;
namespace CSharp_003_同步TCP客户端
{
public partial class frmMain : Form
{
//定义回调//定义委托
private delegate void ShowReceiveMsgCallBack(string text);
//声明回调//声明委托
private ShowReceiveMsgCallBack showReceiveMsgCallBack;
//定义回调
private delegate void SetProgressBarValueCallBack();
//声明回调
private SetProgressBarValueCallBack setProgressBarValueCallBack;
private TcpClient myTcpClient; //声明TCP客户端
private NetworkStream netStream; //声明网络数据流
private Thread receiveDataThread; //声明接收数据进程
public frmMain()
{
InitializeComponent();
}
private void frmMain_Load(object sender, EventArgs e)
{
//初始化回调//实例化委托
showReceiveMsgCallBack = new ShowReceiveMsgCallBack(AddMsgToList);
//初始化回调
setProgressBarValueCallBack = new SetProgressBarValueCallBack(SetProgressBarValue);
}
private void btnConnect_Click(object sender, EventArgs e)
{
//创建并实例化IP终结点
IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse(txtServerIp.Text), Convert.ToInt32(txtServerPort.Text));
//实例化TCP客户端
myTcpClient = new TcpClient();
try
{
//发起TCP连接
myTcpClient.Connect(iPEndPoint);
//获取绑定的网络数据流
netStream = myTcpClient.GetStream();
//实例化接收数据进程
receiveDataThread = new Thread(ReceiveMsg);
receiveDataThread.Start();
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
//接收消息线程
private void ReceiveMsg()
{
MessageBox.Show("客户端已连接服务器!");
while (true)
{
try
{
//获取数据
byte[] getData = new byte[1024];
netStream.Read(getData,0,getData.Length);
//转换为字符串形式
string strMsg = Encoding.Default.GetString(getData);
//将接收的消息添加到列表中//调用回调
lstReceiveMsg.Invoke(showReceiveMsgCallBack,strMsg);
//改变进度条
pgMsg.Invoke(setProgressBarValueCallBack);
}
catch(ThreadAbortException)
{
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
//释放相关资源
if(netStream != null)
{
netStream.Dispose();
}
break;
}
}
}
//回调函数的实现函数//被委托的函数
private void AddMsgToList(string text)
{
lstReceiveMsg.Items.Add(text);
}
//回调函数的实现函数
private void SetProgressBarValue()
{
if (pgMsg.Maximum == pgMsg.Value)
{
pgMsg.Value = 1;
}
else
{
pgMsg.Value++;
}
}
private void btnSendMsg_Click(object sender, EventArgs e)
{
byte[] sendData;
sendData=Encoding.Default.GetBytes(txtMsg.Text);
netStream.Write(sendData,0,sendData.Length);
}
private void btnDisConnect_Click(object sender, EventArgs e)
{
//销毁TCP客户端和网络数据流的实例
myTcpClient.Close();
netStream.Dispose();
receiveDataThread.Abort();
}
}
}
TCP服务端:
界面:
代码:
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;
using System.Net.Sockets;
using System.Threading;
namespace CSharp_003服务端
{
public partial class frmMain : Form
{
//定义回调//定义委托
private delegate void ShowReceiveMsgCallBack(string text);
//声明回调//声明委托
private ShowReceiveMsgCallBack showReceiveMsgCallBack;
private TcpListener server; //声明Tcp监听对象
private Thread tcpListenerThread; //声明Tcp监听线程
private Int32 port; //端口号
private IPAddress localAddr; //本地IP地址
private Thread receiveDataThread; //声明接收数据的线程
public frmMain()
{
InitializeComponent();
}
private void btnListen_Click(object sender, EventArgs e)
{
string strPort = txtServerPort.Text;
if (strPort == "")
{
MessageBox.Show("请输入监听端口");
return;
}
try
{
// 设置监听的端口
port = Int32.Parse(strPort);
localAddr = IPAddress.Parse("127.0.0.1");
if (port > 0)
{
//启动服务端监听线程
tcpListenerThread = new Thread(StartListenerTcp);
tcpListenerThread.Start();
}
else
MessageBox.Show("监听端口号必须大于0,建议使用大于1024的端口");
}
catch (System.Exception ex)
{
}
}
//Tcp监听线程的实现函数
private void StartListenerTcp()
{
server = new TcpListener(localAddr, port);
server.Start(); // 开始监听客户端的申请
MessageBox.Show("服务已启动。。。");
try
{
//启动接收数据的线程
receiveDataThread = new Thread(ReceiveMsg);
receiveDataThread.Start();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
receiveDataThread.Abort();
}
}
//接收消息线程的实现函数
private void ReceiveMsg()
{
TcpClient client = server.AcceptTcpClient();
NetworkStream netStream = client.GetStream();
while (true)
{
try
{
netStream = client.GetStream();
//获取数据
byte[] getData = new byte[1024];
netStream.Read(getData, 0, getData.Length);
//转换为字符串形式
string strMsg = Encoding.Default.GetString(getData);
//将接收的消息添加到列表中//调用回调
lstReceiveMsg.Invoke(showReceiveMsgCallBack, strMsg);
//将数据返回
netStream.Write(getData, 0, getData.Length);
}
catch (ThreadAbortException)
{
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
//释放相关资源
if (netStream != null)
{
netStream.Dispose();
}
break;
}
}
}
//回调函数的实现函数//被委托的函数
private void AddMsgToList(string text)
{
lstReceiveMsg.Items.Add(text);
}
private void frmMain_Load(object sender, EventArgs e)
{
//初始化回调//实例化委托
showReceiveMsgCallBack = new ShowReceiveMsgCallBack(AddMsgToList);
}
}
}
作者:韩兆新
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。