简单通讯系统(还不是很完善,供大家借鉴、参考)

应用介绍

分为三个模块:登录、注册以及通讯界面(服务器、客户端),这里程序运行基本是没有问题的,后续还会更新,大家有需要就关注一下,有问题的可以在评论区留言

登录界面

用户名、密码输入,与数据库对比,可选择进入注册及通讯界面

注册界面

输入个人信息,数据库建表,录入数据,完成后返回登录界面进行登录操作。

通讯界面

通讯界面由两部分组成:服务器端与客户端,现仍存在一个问题:在本机测试两个界面通讯是没有问题的,但两个不同机器就不行了,这个问题希望有大牛能够指出,谢谢

效果图及源代码

登录界面

这里注册会跳转到注册页面。登录进入通讯页面,取消按钮还没有写事件。说一下,这里连接有Mysql数据库,右击项目找到NuGet管理,添加MySql.Data包。

效果

在这里插入图片描述
在这里插入图片描述

程序

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using MySql.Data.MySqlClient;
using 注册;
using 客户端;
using Client = 客户端.Client;

namespace 注册登录界面
{
    public partial class Login : Form
    {
        Register register=new Register();
        客户端.Client client=new 客户端.Client();
        public Login()
        {
            InitializeComponent();
        }

        private bool Mask()
        {
            string connectStr = "server=localhost;port=3306;user=root;password=123456;database=networkcommunication";
            MySqlConnection conn = new MySqlConnection(connectStr);
            conn.Open();
            Console.WriteLine("数据库连接成功!");
            string select_UserName = $"select Name from customer where UserName='{txtEdit_UserName.Text}' and Password='{txtEdit_Password.Text}'";
            MySqlCommand cmd = new MySqlCommand(select_UserName, conn);            
            MySqlDataReader reader = cmd.ExecuteReader();
            if (reader.Read())//如果用户名和密码正确则能查询到一条语句,即读取下一行返回true
            {
                XtraMessageBox.Show("登陆成功!");
                return true;
            }
            else
            {
                XtraMessageBox.Show("用户名或密码不正确!");
                return false;
            }
        }

        private void sbt_Login_Click(object sender, EventArgs e)
        {
            if (Mask())
            {
                this.Hide();
                if (client.ShowDialog()==DialogResult.OK)
                {
                    this.Close();
                }
                
            }
            
        }

        private void sbt_Register_Click(object sender, EventArgs e)
        {
            this.Hide();
            if (register.ShowDialog()==DialogResult.OK)
            {
                register.Close();
                this.Show();
                txtEdit_UserName.Text = null;
                txtEdit_Password.Text = null;
            }
            
        }
    }
}

注册界面

注册界面也是连库操作,跟上面登录界面导入数据库包操作一样,另外还需要添加一个EnumsNET,用于枚举获取输入的报错信息

效果

在这里插入图片描述
在这里插入图片描述

程序

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using MySql.Data.MySqlClient;
using EnumsNET;
using AttributeCollection = EnumsNET.AttributeCollection;

namespace 注册
{
    public partial class Register : Form
    {
        private MySqlConnection conn;
        private Customer customer;
        //Register register=new Register();
        public Register()
        {
            InitializeComponent();
        }

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            string connectStr = "server=localhost;port=3306;user=root;password=123456;database=networkcommunication";
            conn = new MySqlConnection(connectStr);
            conn.Open();
            if (KeyValueNull())return;

            GetValue();
            
            CreatTable();
            InsertInto();
            XtraMessageBox.Show("注册成功!");
            this.DialogResult=DialogResult.OK;
        }

        private void GetValue()
        {
            customer = new Customer();
            customer.Name = txtEdit_Name.Text;
            customer.Sex = txtEdit_Sex.Text;
            customer.Common = Convert.ToInt32(txtEdit_IdNumber.Text.Substring(6, 4));
            customer.Age = DateTime.Now.Year - customer.Common+1;
            customer.Birth = txtEdit_IdNumber.Text.Substring(6, 8);
            customer.IdNumber = Convert.ToInt64(txtEdit_IdNumber.Text);
            customer.NativePlace = txtEdit_NativePlace.Text;
            customer.UserName = txtEdit_UserName.Text;
            customer.Password = txtEdit_Password.Text;
        }

        private void InsertInto()
        {
            string msg =
                $"insert into Customer(Name,Sex,Age,Birth,IdNumber,NativePlace,UserName,Password)" +
                $"values('{customer.Name}','{customer.Sex}',{ customer.Age},{ customer.Birth}," +
                $"{ customer.IdNumber},'{customer.NativePlace}','{customer.UserName}','{customer.Password}')";
            try
            {
                MySqlCommand info = new MySqlCommand(msg, conn);
                info.ExecuteNonQuery();
            }
            catch (Exception)
            {

            }
            finally
            {
                conn.Close();
            }
        }

        private void CreatTable()
        {
            try
            {
                MySqlCommand creatTable =
                    new MySqlCommand(
                        "create table Customer(Id int(5),Name char(10),Sex char(1),Age int(3) " +
                        ",Birth datetime, IdNumber char(18), NativePlace char(10)," +
                        "UserName char(10), Password char(10))",
                        conn);
                creatTable.ExecuteNonQuery();
            }
            catch (Exception)
            {

            }
        }

        private bool KeyValueNull()
        {
            if (CheckMsg(txtEdit_Name.Text, EnumValueNull.Name))return true;
            if (CheckMsg(txtEdit_IdNumber.Text, EnumValueNull.IdNumber)) return true;
            if (CheckMsg(txtEdit_UserName.Text, EnumValueNull.UserName)) return true;
            if (CheckMsg(txtEdit_Password.Text, EnumValueNull.Password)) return true;
            if (!txtEdit_Password.Text.Equals(txtEdit_PsdConfirmation.Text))
            {
                XtraMessageBox.Show("两次密码输入有误,请重新输入!");
                txtEdit_Password.Text = null;
                txtEdit_PsdConfirmation.Text = null;
                return true;
            }
            return false;
        }

        private bool CheckMsg(string str,EnumValueNull file)
        {
            AttributeCollection attribute = file.GetAttributes();
            DescriptionAttribute description = (DescriptionAttribute) attribute[0];
            if (string.IsNullOrEmpty(str))
            {
                XtraMessageBox.Show(description.Description, "警告");
                return true;
            }
            return false;
        }

        private enum EnumValueNull
        {
            [Description("姓名不能为空!")]
            Name= 0,
            [Description("身份证号不能为空!")]
            IdNumber=1,
            [Description("用户名不能为空!")]
            UserName = 2,
            [Description("密码不能为空!")]
            Password = 3
        }
        private class Customer
        {
            public string Name { get; set; }
            public string Sex { get; set; }
            public int Age { get; set; }
            public string Birth { get; set; }
            public long IdNumber { get; set; }
            public string NativePlace { get; set; }
            public string UserName { get; set; }
            public string Password { get; set; }
            public int Common { get; set; }
        }
    }
}

通讯界面

效果

IP地址和端口号都是可以更改的
在这里插入图片描述
这里服务器的IP是自动获取(不可修改),端口号是可以修改的
在这里插入图片描述
这里操作需要注意的是,先打开服务器进行本地监听,然后再开启客户端进行连接,下拉框会加载连接到服务器的客户端,需要给谁发送消息就选择相应ed客户端,这里服务器的信息显示还有一点小问题,以后再改进程序再更新吧
在这里插入图片描述

程序

客户端
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 客户端
{
    public partial class Client : Form
    {
        Socket socket_send;
        public Client()
        {
            InitializeComponent();
        }

        private void sbt_Connet_Click(object sender, EventArgs e)
        {
            try
            {
                socket_send = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse(tEt_Ip.Text);
                IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(tEt_ProtNumber.Text));
                socket_send.Connect(point);
                ShowMessage(0, "连接成功!");

                Thread th_recive = new Thread(Recive);
                th_recive.IsBackground = true;
                th_recive.Start();
            }
            catch (Exception)
            {
            }
            
        }

        private void ShowMessage(int p,string str)
        {
            if (p==0)
            {
                memoEdit1.Text = $"{memoEdit1.Text}{socket_send.RemoteEndPoint}:{str}\r\n";
            }
            else if(p==1)
            {
                memoEdit2.Text= $"{memoEdit2.Text}To:{socket_send.RemoteEndPoint}\r\n{str}\r\n";
            }
            else
            {
                memoEdit2.Text = $"{memoEdit2.Text}{socket_send.RemoteEndPoint}\r\n{str}\r\n";
            }
        }

        private void sbt_Send_Click(object sender, EventArgs e)
        {
            try
            {
                string str = textEdit1.Text;
                byte[] buffer = Encoding.UTF8.GetBytes(str);
                socket_send.Send(buffer);
                ShowMessage(1, str);
                textEdit1.Text = null;
            }
            catch (Exception){}
            
        }

        private void Recive()
        {
            try
            {
                while (true)
                {
                    byte[] bytes = new byte[1024 * 1024];
                    int count = socket_send.Receive(bytes);
                    if (count == 0) break;
                    string str = Encoding.UTF8.GetString(bytes, 0, count);
                    ShowMessage(2, str);
                }
            }
            catch (Exception){}
           
        }

        private void Client_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void Client_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.DialogResult=DialogResult.OK;
        }
    }
}

服务器
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.Utils.Extensions;
using static System.Net.Dns;

namespace 服务器
{
    public partial class Server : Form
    {
        private Socket socket_Watch;
        private Socket socket_send;
        private Thread thread_Recive;
        private DataTable ClientIpAdresses;
        public Server()
        {
            InitializeComponent();
        }

        private void sbt_Start_Click(object sender, EventArgs e)
        {
            try
            {
                //在服务器端创建一个负责监听IP地址跟端口号的的Socket
                socket_Watch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Any;
                //创建端口号对象
                IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(tEt_PortNumber.Text));
                //绑定监听端口   
                socket_Watch.Bind(point);
                Information(0, "监听成功!");
                socket_Watch.Listen(10);

                Thread thread_Lisend = new Thread(Lisend);
                thread_Lisend.IsBackground = true;
                thread_Lisend.Start();
            }
            catch (Exception)
            {
            }
           
        }

        private void Information(int p,string infor)
        {
            if (p==0)
            {
                mEt_Information.Text = mEt_Information.Text + $"{infor}\r\n";
            }
            else if(p==1)
            {
                memoEdit1.Text = $"{memoEdit1.Text}To:{socket_send.RemoteEndPoint}\r\n{infor}\r\n";
            }
            else
            {
                memoEdit1.Text = $"{memoEdit1.Text}{socket_send.RemoteEndPoint}\r\n{infor}\r\n";
            }
        }

        private void Lisend()
        {
            try
            {
                while (true)
                {
                    socket_send = socket_Watch.Accept();
                    Information(0,$"{socket_send.RemoteEndPoint}  :连接成功!");
                    //将连接上的客户端IP存入集合ClientAddresses
                    ClientIpAdresses.Rows.Add(socket_send,socket_send.RemoteEndPoint.ToString());
                    //lEt_ClientIp.EditValue = socket_send.RemoteEndPoint.ToString();
                    lEt_ClientIp.Properties.DataSource = ClientIpAdresses;
                    thread_Recive = new Thread(Recive);
                    thread_Recive.IsBackground = true;
                    thread_Recive.Start();
                }
            }
            catch (Exception){ }
        }
        /// <summary>
        /// 接收数据
        /// </summary>
        private void Recive()
        {
            try
            {
                while (true)
                {
                    byte[] buffer = new byte[1024 * 1024];
                    int count = socket_send.Receive(buffer);
                    if (count == 0) break;
                    string str = Encoding.UTF8.GetString(buffer, 0, count);
                    Information(2,str);

                }
            }
            catch (Exception){ }
            
        }
        private void Server_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
            string hostName = GetHostName();
            IPHostEntry ip = GetHostByName(hostName);
            var firstOrDefault = ip.AddressList.FirstOrDefault();
            if (firstOrDefault != null) tEt_Ip.Text = firstOrDefault.ToString();
            ClientIpAdresses=new DataTable();
            ClientIpAdresses.Columns.Add("Socket",typeof(Socket));
            ClientIpAdresses.Columns.Add("客户端",typeof(string));
            lEt_ClientIp.Properties.DataSource = ClientIpAdresses;
            //text显示的值
            lEt_ClientIp.Properties.DisplayMember = "客户端";
            //下拉框显示
            lEt_ClientIp.Properties.ValueMember = "客户端";
        }
        private void sbt_Send_Click(object sender, EventArgs e)
        {
            string str = textEdit1.Text;
            byte[] bytes = Encoding.UTF8.GetBytes(str);
            Socket send= ClientIpAdresses.Rows[lEt_ClientIp.ItemIndex][0] as Socket;
            send.Send(bytes);
            Information(1,str);
            textEdit1.Text = null;
        }
    }
}

【原 书 名】 Communication Systems Fourth Edition 【原出版社】 John Wiley 【作  者】(加)Simon Haykin [同作者作品] [作译者介绍] 【译  者】 宋铁成[同译者作品] 徐平平 徐志勇 等 【丛 书 名】 国外电子与通信教材系列 【出 版 社】 电子工业出版社 【书 号】 7505382543 【出版日期】 2003 年10月 【开 本】 16开 【页 码】 719 【版 次】1-1 【内容简介】本书对通信系统的基础理论和关键环节进行了深入分析,力图让学生在讨论中领会通信的精髓。全书首先给出通信系统的梗概及需要研究的关键技术,接着分章详细讨论了随机过程、连续波调制、脉冲调制、基带脉冲传输、信号空间分析、带通数据传输、扩频调制、多用户无线通信、信息论基础以及差错控制编码等。各章都附有大量习题,便于学生实践掌握。书中还给出了很有价值的附录,包括概率论、信号和系统描述、贝叶斯函数、超几何分布函数汇总、密码学方面的介绍以及一些有用的表格等。全书强调通信理论的统计基础,并给出了用MATLAB模拟的8个计算机实验,这些实验几乎覆盖了各章节的主要内容,形成了独特的通信理论“软件实验室”。 【编辑推荐】随着微电子技术、计算机技术、激光技术、卫星与光纤等相关信息技术的发展,特别是计算机与通信的有机结合,现代通信正经历着一场变革。在这场变革中,各种新技术、新手段、新业务、新系统层出不穷,现代通信的内容也日趋丰富。在通信新技术不断产生,新需求逐步扩展的背景下,建立在多网互连互通、多个系统集成、多种技术综合应用基础上的一体化通信、全球个人通信迅速发展,这就要求通信技术工作者和通信工程等专业的学生不仅深入学习本专业的典型通信系统,还要全面学习和了解目前广泛应用的各种现代通信系统,以全面、系统地了解现代通信的目的。本书正是为了实现这一目的而编写的。 作者介绍:Simon Haykin是国际电子电气工程界的著名学者,加拿大皇家学会院士,IEEE会士,于1953年获得英国伯明翰大学博士学位,现任加拿大麦克马斯特大学教授,在该校创办了通信研究实验室并长期担任主任。他曾经获得IEEE McNaughton奖章,在神经网络、通信、自适应滤波器等领域成果颇丰,著有多种标准教材。 目录 第1章 随机过程 1.1 简介 1.2 随机过程的数字定义 1.3 平稳过程 1.4 均值、相关函数和协方差函数 1.5 遍历过程 1.6 随机过程通过一个线性时不变滤波器 1.7 功率谱密度 1.8 高斯过程 1.9 噪声 1.10 窄带噪声 1.11 基于同相和正交分量的窄带噪声表示法 1.12 基于包络和相位分量的窄带噪声表示法 1.13 正弦信号加窄带噪声 1.14 计算机实验:平衰落信道 1.15 总结与讨论 注释与参考 习题 第2章 连续波调制 第3章 脉冲调制 第4章 基带脉冲传输 第5章 信号空间分析 第6章 通带数据传输 第7章 扩频调制 第8章 多用户无线通信 第9章 信息论基础 第10章 差错控制编码 附录1 概率论 附录2 信号与系统简述 附录3 贝塞尔函数 附录4 汇合型超几何函数 附录5 密码学 附录6 表格 术语表 参考文献 索引
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值