下面笔者要介绍的是在学习TCP通信技术编写的一个小型聊天程序,下面是它的创建过程。
1.建立一个window应用程序,添加3个Label、2个textBox、一个listBox、一个Button,分别设置属性如下:
label1: name=label1, text="IP地址";
label2: name=label2, text="接收框";
label3: name=label3, text="发送框";
textBox1:name=textBoxIP, text="";
textBox2:name=textBox2, text="";
listBox1: name=listBox1, text="";
Button1: name=btnSend, text="发送";
在这篇博文中,最主要的思路是建立两个连接端口,一个用来接收数据,另一个用来发送数据。
其中,接收数据是要一直存在的,所以我创建了一个线程,用来运行侦听特定端口的用户请求的侦听方法StartListen(),在窗体Load的时候就开始运行,一直到程序被关闭才结束,这就保证了数据持续接收。在StartListen()方法中,我设置了一个循环,用来接收对方主机发来的数据。
接下来要介绍的是发送功能了,这个功能我设置了发送按钮,并为其创建了单击事件,用来连接对方主机并发送数据,对于这个方法在主线程中进行就可以了,毕竟它是用户主动触发的。在发送完数据后关闭现有网络连接,以保证下次发送不出异常。下面是我的代码了。
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Net; 10 using System.Net.Sockets; 11 using System.Threading; 12 13 namespace myClient 14 { 15 16 public partial class Client : Form 17 { 18 //这些是全局变量 19 private TcpClient tClient = new TcpClient(); 20 private NetworkStream streamToServer; 21 private IPAddress ipAddress; 22 private IPAddress ipAdd; 23 private TcpListener tListener; 24 private NetworkStream ns; 25 //构造函数 26 public Client() 27 { 28 InitializeComponent(); 29 } 30 //发送数据 31 private void btnSend_Click(object sender, EventArgs e) 32 { 33 connectServer(); 34 } 35 //连接服务器 36 private void connectServer() 37 { 38 try 39 { 40 tClient = new TcpClient();//初始化实例 41 byte[] buffer = Encoding.UTF32.GetBytes(textBox2.Text);//获取要发送的数据 42 ipAddress = IPAddress.Parse(textBoxIP.Text.ToString());//远程主机IP 43 try 44 { 45 tClient.Connect(ipAddress, 11000);//连接远程主机 46 } 47 catch (Exception ee) 48 { 49 MessageBox.Show("Error:" + ee.ToString()); 50 } 51 try 52 { 53 streamToServer = tClient.GetStream();//获取网络流 54 streamToServer.Write(buffer, 0, buffer.Length);//写入流 55 streamToServer.Close();//关闭网络流 56 tClient.Close();//关闭客户端连接 57 } 58 catch { 59 MessageBox.Show("连接未成功"); 60 } 61 } 62 catch (Exception e) 63 { 64 MessageBox.Show("Sending Message Failed!" + e.Message); 65 } 66 textBox2.Text = "";//清空“发送”文本框内容 67 } 68 //窗体登陆 69 private void Client_Load(object sender, EventArgs e) 70 { 71 Thread conn = new Thread(new ThreadStart(StartListen));//创建次线程,用来运行侦听事件 72 conn.IsBackground = true;//设置次线程为后台线程,以便在程序关闭时可以自动关闭次线程 73 conn.Start();//执行线程 74 } 75 //侦听特定端口的用户请求 76 public void StartListen() 77 { 78 try 79 { 80 ipAdd = IPAddress.Parse(textBoxIP.Text.ToString());//远程主机IP 81 tListener = new TcpListener(ipAdd, 11001);//创建TcpListener对象实例 82 tListener.Start(); //启动侦听 83 } 84 catch (Exception ex) 85 { 86 MessageBox.Show("Can‘t Start Server" + ex.Message); 87 return; 88 } 89 while (true)//进入无限循环等待用户端连接 90 { 91 byte[] buffer = new Byte[200]; 92 try 93 { 94 tClient = tListener.AcceptTcpClient();//创建客户端连接对象 95 ns = tClient.GetStream();//得到网络流 96 int len = ns.Read(buffer, 0, 200);//读取数据 97 } 98 catch (Exception re) 99 { 100 MessageBox.Show(re.Message); 101 } 102 listBox1.Items.Add(Encoding.UTF32.GetString(buffer));//在窗体内显示对方发来的信息 103 104 } 105 ns.Close();//关闭网络流 106 tClient.Close();//关闭客户端连接 107 } 108 } 109 }
我个人觉着注释的蛮清晰的,应该看得懂,其他的就不多讲了,希望能对学习TCP的新手博友们有点帮助。