TA的每日心情 | 奋斗 2016-5-30 09:59 |
---|
签到天数: 9 天 [LV.3]偶尔看看II
|
今天在看网络编程的东西 看了一个对Tcp编程的数据流操作,做读取和写入数据!灵机一动!做了一个小玩意!
下面我展示一下代码!编程大牛就勿喷吧!
首先是服务端:
using System.Net;
using System.Net.Sockets;//用于Sockets编程 (TCP编程)
using System.Threading;//创建线程所需要的名词空间
using System.IO; //用于对流数据进行操作
//以上这些都是名词空间
namespace 服务端
{
public partial class Form1 : Form
{
//一下这些都是定义的全局变量
private delegate void myTCP(string str);//定于调用委托的函数
private Thread thThreadRead;//用于创建线程的函数
private IPAddress IP;//用于创建IP对象
private TcpListener TcpL;//用于监听端口
private TcpClient TcpC;用于做TCP连接
private NetworkStream nsStream; //这个是监听数据流的
private StreamReader srRead;//用以向网络基础数据流传送数据(读取)
private StreamWriter swWriter; //用以向网络基础数据流传送数据(写入)
private bool KG;//定义的一个识别点 判断程序是否在运行中
private bool TcpTX = false;//定义的一个识别点 判断TCP连接是否连接中 默认为否
//程序的入口点
public Form1()
{
InitializeComponent();//这个是初始化程序运行引擎 系统默认必须要写的
this.btnOK.Click += new EventHandler(btnOK_Click);//建立btnOK按钮的点击事件
this.button1.Click += new EventHandler(button1_Click);//建立button1按钮的点击事件
}
//button1按钮的点击事件 用于把数据写入带数据流
void button1_Click(object sender, EventArgs e)
{
if (TcpTX == true)//判断Tcp连接是否连通
{
swWriter.WriteLine(textBox1.Text);//把textBox1控件里面的内容记录到缓存
swWriter.Flush();//缓存里面的内容写入到数据流
}
else//否者就会弹出警告框提示错误
{
MessageBox.Show("错误:客服端还没有连接服务器!");//弹出警告框
}
}
//labZT控件的委托 因为线程中是无法对控件直接进行操作的!
private void UpdateLabZT(string str)
{
this.labZT.Text = str;
}
//LisBox控件的委托
private void UpdateLabLis(string str)
{
this.listBox1.Items.Add(str);
}
//建立btnOK按钮的事件
void btnOK_Click(object sender, EventArgs e)
{
thThreadRead = new Thread(new ThreadStart(TcpLis));//创建线程 并在线程中执行TcpLis方法
thThreadRead.Start();//线程开始运行
KG = true;//KG等于是
TcpTX = true;//TCP连接连通
}
//这里是我定义的一个TcpLis的方法
private void TcpLis()
{
myTCP MT = new myTCP(UpdateLabZT);//这个用于调用委托
myTCP ML = new myTCP(UpdateLabLis);//这个同上
this.BeginInvoke(MT, new object[] { "服务端准备启动........." });//这个是在线程中对调用的委托进行操作
IP = new IPAddress(new byte[] { 127, 0, 0, 1 });//定义一个IP
TcpL = new TcpListener(IP, 8500);//对定义的IP的8500进行监听
TcpL.Start();//开始监听
this.BeginInvoke(MT, new object[] { "服务端正在运行........." });//这个是在线程中对调用的委托进行操作
TcpC = TcpL.AcceptTcpClient();//允许一个Tcp连接连入
this.BeginInvoke(ML, new object[] { "发现连接目标!IP:" + TcpC.Client.RemoteEndPoint });//用于显示Tcp连入的目标机器IP
nsStream = TcpC.GetStream();//获取TCP连接的数据流
srRead = new StreamReader(nsStream);//读取获取的数据流
swWriter = new StreamWriter(nsStream);//定义写入获取的数据流操作
while (KG)
{
string NR = srRead.ReadLine();//返回一行数据流的数据 并以字符串格式的形式
this.BeginInvoke(ML, "对方:" + NR);//用于显示读取的数据流信息
}
}
}
}
好了以上的是服务端类容! 注释的好累啊! 下面是客户端的内容! 里面有些上面注释过的 我就不重复注释了!
客服端:
namespace 客服端
{
public partial class Form1 : Form
{
private Thread thThreadRead;
private TcpClient TcpC;
private delegate void myTCP(string str);
private bool TcpTX = false;
private StreamWriter swWriter; //用以向网络基础数据流传送数据
private StreamReader srRead;
private NetworkStream nsStream; //创建发送数据的网络基础数据流
private bool KG;
//建立的委托
private void UpdateLabZT(string str)
{
this.label1.Text = str;
}
//建立的委托
private void UpdateLabLis(string str)
{
this.listBox1.Items.Add(str);
}
//程序入口点
public Form1()
{
InitializeComponent();
this.button1.Click += new EventHandler(button1_Click);
this.button2.Click += new EventHandler(button2_Click);
}
//button2的点击事件
void button2_Click(object sender, EventArgs e)
{
if (TcpTX == true)//判断TCP连接是否连通
{
swWriter.WriteLine(textBox1.Text);
swWriter.Flush();
}
else
{
MessageBox.Show("错误:客服端还没有连接服务器!");
}
}
//button1的点击事件
void button1_Click(object sender, EventArgs e)
{
thThreadRead = new Thread(new ThreadStart(TCPLJ));
thThreadRead.Start();
KG = true;
}
//连接TCP连接方法
private void TCPLJ()
{
myTCP MT = new myTCP(UpdateLabZT);
myTCP ML = new myTCP(UpdateLabLis);
this.BeginInvoke(MT, new object[] { "客服端准备启动........." });
TcpC = new TcpClient();
this.BeginInvoke(MT, new object[] { "客服端正在运行........." });
try
{
TcpC.Connect("localhost", 8500);//定义一个连接的目标 并连接
this.BeginInvoke(ML, new object[] { "已连接服务器!IP:" + TcpC.Client.RemoteEndPoint });//提示连接目标的IP
TcpTX = true;//连接连通
nsStream = TcpC.GetStream();//获取数据流
swWriter = new StreamWriter(nsStream);
srRead = new StreamReader(nsStream);
while (KG)
{
string NR = srRead.ReadLine();
this.BeginInvoke(ML, "对方:" + NR);
}
}
catch (Exception ex)//错误判断 如果发生错误执行这里的代码
{
this.BeginInvoke(ML, ex.Message);
}
}
}
}
嘿嘿,一个基于TCP通讯的聊天小软件就这么做好了!
|
|