界面展示

本文展示了一个基于C#的TCP聊天应用程序的界面代码实现。该程序同时具备服务器和客户端功能,主要特点包括:1) 自动获取本地IP和主机名;2) 支持配置服务器端口和客户端连接参数;3) 使用多线程处理网络连接和消息收发;4) 实现双向消息传输功能;5) 包含消息显示和发送的UI界面。代码结构清晰,通过BinaryReader/Writer处理网络流,使用Timer定时检查新消息,并提供完善的资源释放机制。该实现可作为基础网络通信框架,适用于需要双向通信的应用场景。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.Remoting.Messaging;

namespace BothSeverClientChat
{
    public partial class tcpchat : Form
    {
        //初始化变量
        string myip;
        string myname;
        string myport;


        //自己作为服务端的公共数据
        string myserverip;//自己的服务端IP
        string myservername;//服务端名称
        int myserverport;//服务端端口
        
        private TcpClient mywaitclient;
        private TcpListener TcpwaitListener;

        NetworkStream serverstream;
        private BinaryReader serverreader;
        private BinaryWriter serverwriter;

        private Thread mywaitthread;//等待连接线程
        private static string messageasserver = "";//作为服务端的消息



        //自己作为客户端的公共数据
        string myclientip;
        string myclientname;
        int myclientport;

        private TcpClient mysendclient;

        NetworkStream clientstream;
        private BinaryReader clientreader;
        private BinaryWriter clientwriter;

        private Thread myclientthread;//客户端线程
        private static string messageasclient = "";//作为客户端的消息






        public string getmyip()
        {
            ipcbbox.Items.Clear();

            //获取本机局域网IP
            string localname = Dns.GetHostName();//获取本机名
            IPAddress[] ips = Dns.GetHostAddresses(localname);//获取所有IP地址
            ipcbbox.Items.Add("127.0.0.1");
            foreach (IPAddress ip in ips)
            {
                if (!ip.IsIPv6SiteLocal)
                {
                    myip = ip.ToString();
                    ipcbbox.Items.Add(ip.ToString());
                }
                    
            }

            return myip;
        }
        public string getmyname()
        {
            //获取本机名称
            myname = Dns.GetHostName();
            return myname;
        }

        //按照指定格式发送
        private void sendformat(BinaryWriter wt, string msg)
        { 
            wt.Write(myip+" \n"+myname+":"+msg);
            return;
        }
        private string getinforeceive(string msgrd,out IPAddress ip)
        {
            string[] strs = msgrd.Split(new char[] { ' '});
            string ipstr = strs[0];
            if(IPAddress.TryParse(ipstr,out ip))
                ip = IPAddress.Parse(ipstr);
            return msgrd;
        }








        //作为服务端的方法
        public void serverstart()
        {
            //开启服务端线程
            
            mywaitthread = new Thread(new ThreadStart(serverrun));
            mywaitthread.Start();
            tm_checkmessage1.Start();
            
            
        }
        public void serverrun()
        {
            //开始监听
            messageasserver = "";
            TcpwaitListener = new TcpListener(IPAddress.Parse(myserverip), myserverport);
            TcpwaitListener.Start();

            //循环接收连接
            while (true)
            {
                //等待连接
                mywaitclient = TcpwaitListener.AcceptTcpClient();
                serverstream = mywaitclient.GetStream();
                serverreader = new BinaryReader(mywaitclient.GetStream());
                serverwriter = new BinaryWriter(mywaitclient.GetStream());

                //开启服务端循环
                while (true)
                {
                    try
                    {

                        string message = "来自客户端:"+serverreader.ReadString();

                        messageasserver +=  message + "\n";
                        //sendformat(serverwriter,"");
                    }
                    catch
                    {
                        break;
                    }
                }
            }    
        }



        //作为客户端的方法

        public void clientstart()
        {
            //开启客户端线程
            myclientthread = new Thread(new ThreadStart(clientrun));
            myclientthread.Start();
            tm_checkmessage2.Start();
        }
        private void clientrun()
        {
            mysendclient = new TcpClient();
            mysendclient.Connect(myclientip, myclientport);
            if (mysendclient.Connected)
            {
                clientstream = mysendclient.GetStream();
                clientreader = new BinaryReader(mysendclient.GetStream());
                clientwriter = new BinaryWriter(mysendclient.GetStream());
                
                
                
                //开启客户端循环读取消息
                while (true)
                {
                    try
                    {
                        //接收消息
                        string message = clientreader.ReadString();
                        messageasclient += message + "\n";
                        
                    }
                    catch
                    {
                        break;
                    }
                }
            }
            

            
        }















        public tcpchat()
        {
            InitializeComponent();
            getmyip();
            getmyname();
        }

        private void listenbtn_Click(object sender, EventArgs e)
        {
            //初始化作为服务端的ip,端口和名称
            IPAddress ip;

            if (!IPAddress.TryParse(ipcbbox.Text, out ip) || port2.Text == "")
            {
                
                rtxboxserver.AppendText("请填写完整信息\n");
            }
            else
            {
                myserverip = ipcbbox.Text;
                myservername = myname;
                myserverport = Convert.ToInt32(port2.Text);
                rtxboxserver.AppendText("服务端正在开启\n");
                serverstart();
            }
            //开启服务端
        }

       
        private void linkbtn_Click(object sender, EventArgs e)
        {
            //初始化作为客户端的ip,端口和名称
            IPAddress ip;
            //检查ip是否合法
            //if(!IPAddress.TryParse(ip1.Text,out ip))
            //{
            //    rtxboxclient.AppendText("请输入正确的IP地址\n");
            //}
            //else if (port1.Text == ""|| Convert.ToInt32(port1.Text)>65535)
            //{
            //    rtxboxclient.AppendText("请输入正确的端口号\n");
            //}
            //else
            //{
            //    myclientip = ip1.Text;
            //    myclientname = myname;
            //    myclientport = Convert.ToInt32(port1.Text);
            //    rtxboxclient.AppendText("客户端正在开启\n");
            //    clientstart();
            //}
            myclientip = ip1.Text;
            myclientname = myname;
            myclientport = Convert.ToInt32(port1.Text);
            rtxboxclient.AppendText("客户端正在开启\n");
            clientstart();


        }


        //防止输入非数字端口号
        private void port2_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || (e.KeyChar == '\r') || (e.KeyChar == '\b'))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void port1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar) || (e.KeyChar == '\r') || (e.KeyChar == '\b'))
                e.Handled = false;
            else
                e.Handled = true;
        }
        //tm负责更新富文本
        private void tm_checkmessage1_Tick(object sender, EventArgs e)
        {
            if (messageasserver != "")
            {
                rtxboxserver.AppendText(messageasserver);
                rtxboxserver.ScrollToCaret();
                messageasserver = "";
            }
        }

        private void tm_checkmessage2_Tick(object sender, EventArgs e)
        {
            if (messageasclient != "")
            {
                rtxboxclient.AppendText(messageasclient);
                rtxboxclient.ScrollToCaret();
                messageasclient = "";
            }
        }

        private void sendtosever_Click(object sender, EventArgs e)
        {
            if(myclientthread!=null)
            {
                if (myclientthread.ThreadState == ThreadState.Running)
                {
                    if (clientwriter != null)
                    {
                        sendformat(clientwriter, msgtoser.Text);
                    }
                }
            }
        }

        private void sendtoclient_Click(object sender, EventArgs e)
        {
            if (mywaitthread != null)
            {
                if(mywaitthread.ThreadState == ThreadState.Running)
                {
                    if (serverwriter != null)
                    {
                        sendformat(serverwriter, msgtocli.Text);
                    }
                }
            }
        }
        //回车发送消息
        private void msgtocli_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == '\r')
            {
                sendtoclient_Click(sender, e);
            }
        }

        private void msgtoser_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == '\r')
            {
                sendtosever_Click(sender, e);
            }
        }

        private void tcpchat_FormClosed(object sender, FormClosedEventArgs e)
        {
            //释放线程和TCP监听
            if (this.TcpwaitListener != null)
            {
                TcpwaitListener.Stop();
            }
            //释放tcp流
            if (clientstream != null)
                clientstream.Close();
            if(mysendclient != null)
                if (mysendclient.Connected)
                    mysendclient.Close();



            if (serverstream != null)
                serverstream.Close();
            if (mywaitclient!=null)
            {
                if (mywaitclient.Connected)
                    mywaitclient.Close();
            }
            



            if (mywaitthread != null)
            {
                if (mywaitthread.ThreadState == ThreadState.Running)
                {
                    mywaitthread.Abort();
                }
            }
            if (myclientthread != null)
            {
                if (myclientthread.ThreadState == ThreadState.Running)
                {
                    myclientthread.Abort();
                }
            }

        }

        private void rtxboxclient_TextChanged(object sender, EventArgs e)
        {

        }

        private void tcpchat_Load(object sender, EventArgs e)
        {

        }
    }
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐