zoukankan      html  css  js  c++  java
  • 小型聊天器

    下面笔者要介绍的是在学习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的新手博友们有点帮助。

  • 相关阅读:
    Stacktraces java.lang.NoSuchMethodException: com.liuyang.action.UserAction.add()
    Error setting expression 'XXX‘'[Ljava.lang.with value '[Ljava.lang.String;@10101fb'
    Strut2的配置文件strust.xml报错:Package Action extends undefined package struts-default
    org.eclipse.ui.PartInitException: Unable to open editor, unknown editor ID: org.xmen.ui.text.XMLTextEditor
    如何让编译器实现struts2的xml提示
    Caused by: Unable to load configuration.
    OpenSUSE42.3 leap 开启ssh登陆
    LXDE桌面初始设置,Fedora27系统。
    OpenSUSE下支持托盘的邮件客户端Sylpheed
    Linux PuTTY 更改字体
  • 原文地址:https://www.cnblogs.com/Failbs/p/4147447.html
Copyright © 2011-2022 走看看