2022年点对点通信聊天程序 .pdf
点对点通信聊天程序设计文档:基于 SOCKET 的点对点通信聊天Socket是套接字的意思。在套接字下编程很像打电话的过程,打电话之前先申请一条电话线,假设已接至办公室墙上,则相当于申请一个与其他应用程序通信的输入输出接口,而改程序到底与哪个程序通信,取决于其IP 地址。此时,IP 就相当于我们要拨打的电话号码,如果对方也申请了一个Socket ,我们就可以根据其IP 地址跟对方聊天。1.服务器方服务器等待用户从主窗口发来的启动接收消息过程如下:首先建立自己的套接口。然后建立连接调用 listen()函数,开始倾听,再通过accept ()等待接收连接。Accept ()等待请求队列中的请求,一旦有连接请求来到,就可以建立一个与s 有相同属性的套接口。最后关闭套接口。2.客户方客户等待用户从主窗口发来的发送命令,一旦接收到发送请求,调用函数初始化socket ,窗口函数在收到UNSOCK 消息后,判断是由哪个事件引起的,第一次必然是由连接事件引起的,这样就会执行相同的程序。3.程序流程在寻求连接的过程中可能会出现阻塞,是由于操作系统本身原因或者通信信道被其他程序长名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 14 页 - - - - - - - - - 时间占用等导致函数无法返回。这是被阻塞函数会不断调用系统函数来保持消息循环的正常运行。Group 函数group 函数是对数据集按照某个字段或者表达式进行分组,获得一组组的集合,然后从每组中取出一个指定字段或者表达式的值,放到单元格中进行扩展,扩展出来的每个单元格都保留了一个指针指向当前的组集,该组集称为当前组。因此在附属单元格中,需要对该组集进行操作时,不需要用任何条件和主单元格关联,如果加设了条件,反倒导致报表引擎还对组集中的记录进行遍历检索。概要设计:完成的程序应实现如下功能:1 服务器端服务2 客户机服务3 点对点的聊天服务。完成后可看到如下客户页面名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 14 页 - - - - - - - - - 只需在对话框里输入信息就可以实现点对点聊天了。附程序源代码:using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Net; using System.Net.Sockets; using System.IO; using System.Threading; using System.Text; namespace 点对点聊天 / / Form1 的摘要说明。 / public class Form1 : System.Windows.Forms.Form private System.Windows.Forms.Label label1; private System.Windows.Forms.Button button1; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.Label label2; private System.Windows.Forms.TextBox textBox2; private System.Windows.Forms.Label label3; private System.Windows.Forms.TextBox textBox3; private System.Windows.Forms.TextBox textBox4; private System.Windows.Forms.Button button2; private System.Windows.Forms.Label label4; private System.Windows.Forms.Button button3; private System.Windows.Forms.RichTextBox richTextBox1; private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.StatusBar statusBar1; private System.Windows.Forms.GroupBox groupBox4; private System.Windows.Forms.Label label5; private System.Windows.Forms.TextBox textBox5; private System.Windows.Forms.TextBox textBox6; private System.Windows.Forms.Label label6; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 14 页 - - - - - - - - - private System.Windows.Forms.Button button4; private System.Windows.Forms.GroupBox groupBox3; private System.Windows.Forms.RichTextBox richTextBox2; private System.Windows.Forms.Button button5; private Thread listenthread;/表示监听的线程 private string msg; /要发送的消息 private Socket socket1; /Socket类用于接收和发送信息 private IPEndPoint lep; private System.Windows.Forms.GroupBox groupBox5; /请求连接的节点 / / 必需的设计器变量。 / private System.ComponentModel.Container components = null; public Form1() / / Windows 窗体设计器支持所必需的 / InitializeComponent(); / / TODO: 在 InitializeComponent 调用后添加任何构造函数代码 / / / 清理所有正在使用的资源。 / protected override void Dispose( bool disposing ) if( disposing ) if (components != null) components.Dispose(); base.Dispose( disposing ); #region Windows 窗体设计器生成的代码 / / private void InitializeComponent() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 14 页 - - - - - - - - - / textBox1 / this.textBox1.Location = new System.Drawing.Point(8, 48); this.textBox1.Name = textBox1; this.textBox1.Size = new System.Drawing.Size(112, 21); this.textBox1.TabIndex = 2; this.textBox1.Text = ; / / label2 / this.label2.Location = new System.Drawing.Point(8, 72); this.label2.Name = label2; this.label2.Size = new System.Drawing.Size(64, 23); this.label2.TabIndex = 0; this.label2.Text = IP地址 :; this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; / / textBox2 / this.textBox2.Location = new System.Drawing.Point(8, 96); this.textBox2.Name = textBox2; this.textBox2.Size = new System.Drawing.Size(112, 21); this.textBox2.TabIndex = 2; this.textBox2.Text = ; / / label3 / this.label3.Anchor = (System.Windows.Forms.AnchorStyles)(System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left); this.label3.Location = new System.Drawing.Point(80, 112); this.label3.Name = label3; this.label3.Size = new System.Drawing.Size(64, 23); this.label3.TabIndex = 3; this.label3.Text = 我的昵称 :; this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; / / textBox3 / this.textBox3.Anchor = (System.Windows.Forms.AnchorStyles)(System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left); this.textBox3.Location = new System.Drawing.Point(136, 112); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 14 页 - - - - - - - - - this.textBox3.Name = textBox3; this.textBox3.Size = new System.Drawing.Size(128, 21); this.textBox3.TabIndex = 4; this.textBox3.Text = ; / / textBox4 / this.textBox4.Location = new System.Drawing.Point(8, 48); this.textBox4.Name = textBox4; this.textBox4.Size = new System.Drawing.Size(120, 21); this.textBox4.TabIndex = 5; this.textBox4.Text = 221.237.165.15; / / button2 / this.button2.Anchor = (System.Windows.Forms.AnchorStyles)(System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left); this.button2.Location = new System.Drawing.Point(272, 112); this.button2.Name = button2; this.button2.Size = new System.Drawing.Size(72, 23); this.button2.TabIndex = 6; this.button2.Text = 发送 ; this.button2.Click += new System.EventHandler(this.button2_Click); / / label4 / this.label4.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.label4.Location = new System.Drawing.Point(8, 16); this.label4.Name = label4; this.label4.Size = new System.Drawing.Size(120, 23); this.label4.TabIndex = 7; this.label4.Text = 服务器 IP:; this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; / / button3 / this.button3.Location = new System.Drawing.Point(8, 48); this.button3.Name = button3; this.button3.Size = new System.Drawing.Size(64, 23); this.button3.TabIndex = 8; this.button3.Text = 开始监听 ; this.button3.Click += new System.EventHandler(this.button3_Click); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 14 页 - - - - - - - - - / / richTextBox1 / this.richTextBox1.Anchor = (System.Windows.Forms.AnchorStyles)(System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right); / textBox6 / this.textBox6.Location = new System.Drawing.Point(80, 80); this.textBox6.Name = textBox6; this.textBox6.Size = new System.Drawing.Size(48, 21); this.textBox6.TabIndex = 5; this.textBox6.Text = ; / / label6 / this.label6.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.label6.Location = new System.Drawing.Point(8, 80); this.label6.Name = label6; this.label6.Size = new System.Drawing.Size(64, 23); this.label6.TabIndex = 7; this.label6.Text = 目标端口 :; this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; / / button5 / this.button5.Location = new System.Drawing.Point(8, 120); this.button5.Name = button5; this.button5.Size = new System.Drawing.Size(64, 23); this.button5.TabIndex = 8; this.button5.Text = 请求连接 ; this.button5.Click += new System.EventHandler(this.button5_Click); / / label5 / this.label5.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.label5.Location = new System.Drawing.Point(8, 16); this.label5.Name = label5; this.label5.Size = new System.Drawing.Size(64, 23); this.label5.TabIndex = 7; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 14 页 - - - - - - - - - this.label5.Text = 监听端口 :; this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; / / textBox5 / this.textBox5.Location = new System.Drawing.Point(80, 16); this.textBox5.Name = textBox5; this.textBox5.Size = new System.Drawing.Size(48, 21); this.textBox5.TabIndex = 5; this.textBox5.Text = ; / / groupBox2 r = (System.Windows.Forms.AnchorStyles)(System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right); this.groupBox4.Controls.Add(this.textBox3); this.groupBox4.Controls.Add(this.button4); this.groupBox4.Controls.Add(this.richTextBox1); this.groupBox4.Controls.Add(this.label3); this.groupBox4.Controls.Add(this.button2); this.groupBox4.Location = new System.Drawing.Point(8, 272); this.groupBox4.Name = groupBox4; this.groupBox4.Size = new System.Drawing.Size(352, 144); this.groupBox4.TabIndex = 17; this.groupBox4.TabStop = false; this.groupBox4.Text = 发送窗口 ; ( System.Windows.Forms.AnchorStyles)(System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left); this.button4.Location = new System.Drawing.Point(8, 112); this.button4.Name = button4; this.button4.Size = new System.Drawing.Size(64, 23); this.button4.TabIndex = 12; this.button4.Text = 清空消息 ; this.button4.Click += new System.EventHandler(this.button4_Click); / / groupBox3 / this.groupBox3.Anchor = (System.Windows.Forms.AnchorStyles)(System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right); this.groupBox3.Controls.Add(this.richTextBox2); this.groupBox3.Location = new System.Drawing.Point(8, 8); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 14 页 - - - - - - - - - this.groupBox3.Name = groupBox3; this.groupBox3.Size = new System.Drawing.Size(352, 264); this.groupBox3.TabIndex = 18; this.groupBox3.TabStop = false; this.groupBox3.Text = 聊天记录 ; / / richTextBox2 / this.richTextBox2.Anchor = (System.Windows.Forms.AnchorStyles)(System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right); this.richTextBox2.Location = new System.Drawing.Point(8, 16); this.richTextBox2.Name = richTextBox2; this.richTextBox2.Size = new System.Drawing.Size(336, 240); this.richTextBox2.TabIndex = 0; this.richTextBox2.Text = ; / / groupBox5 / this.groupBox5.Controls.Add(this.label5); this.groupBox5.Controls.Add(this.textBox5); this.groupBox5.Controls.Add(this.button3); this.groupBox5.Location = new System.Drawing.Point(368, 184); this.groupBox5.Name = groupBox5; this.groupBox5.Size = new System.Drawing.Size(136, 80); this.groupBox5.TabIndex = 19; this.groupBox5.TabStop = false; this.groupBox5.Text = 监听设置 ; / Form1 / this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); this.ClientSize = new System.Drawing.Size(512, 438); this.Controls.Add(this.groupBox5); this.Controls.Add(this.groupBox3); this.Controls.Add(this.groupBox4); this.Controls.Add(this.statusBar1); this.Controls.Add(this.groupBox1); this.Controls.Add(this.groupBox2); this.MaximumSize = new System.Drawing.Size(520, 472); this.MinimumSize = new System.Drawing.Size(520, 472); this.Name = Form1; this.Text = 点对点聊天 ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 14 页 - - - - - - - - - this.Closing += new System.ComponentModel.CancelEventHandler(this.Form1_Closing); this.groupBox1.ResumeLayout(false); this.groupBox2.ResumeLayout(false); this.groupBox4.ResumeLayout(false); this.groupBox3.ResumeLayout(false); this.groupBox5.ResumeLayout(false); this.ResumeLayout(false); #endregion / / 应用程序的主入口点。 / STAThread static void Main() Application.Run(new Form1(); private void listenstart()/监听发入的信息 try while(this.socket1.Connected) /设置一个缓冲区 Byte stream=new Byte1024; socket1.Receive(stream); /将获得的流转化为字符串类型 string message=Encoding.Default.GetString(stream); /this.textBox1.Text=socket1.Available.ToString(); this.richTextBox2.AppendText(message); this.richTextBox2.AppendText( ); catch/(Exception error) if(!this.socket1.Connected) socket1.Close(); button3.Enabled=true; button5.Enabled=true; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 14 页 - - - - - - - - - private void button1_Click(object sender, System.EventArgs e) /获取本地主机名称 string host=Dns.GetHostName(); this.textBox1.Text=host; /获取本机IP IPAddress addrs = Dns.Resolve(localhost).AddressList; IPAddress addr = Dns.Resolve(host).AddressList0; /转化为标准的以点分隔的四部分格式 this.textBox2.Text=addr.ToString(); private void button3_Click(object sender, System.EventArgs e) /获得监听端口 int hostport; try hostport=Int32.Parse(this.textBox5.Text); if(hostport65400)hostport=12800; catch hostport=12800; /IPAddress ipAddress = Dns.Resolve(localhost).AddressList0; IPAddress ipAddress=IPAddress.Parse(0.0.0.0); lep = new IPEndPoint(ipAddress,hostport); socket1=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); try socket1.Bind(lep); socket1.Listen(10000); this.statusBar1.Text=等待连接 .; button3.Enabled=false; button5.Enabled=false; Thread watt=new Thread(new ThreadStart(waits); watt.Start(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 14 页 - - - - - - - - - catch button3.Enabled=true; private void waits() try socket1=socket1.Accept(); this.statusBar1.Text=已建立连接 ; listenthread=new Thread(new ThreadStart(listenstart); listenthread.Start(); button3.Enabled=false; button5.Enabled=false; catch button3.Enabled=true; button5.Enabled=true; private void statusBar1_TextChanged(object sender, System.EventArgs e) private void button2_Click(object sender, System.EventArgs e) if(socket1.Connected) /将发送的字符串转换成字节数组 msg = +this.richTextBox1.Text; Byte bytes=Encoding.Default.GetBytes(msg); /发送数组 try socket1.Send(bytes,bytes.Length,SocketFlags.None); this.richTextBox1.Text=; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 14 页 - - - - - - - - - catch /this.richTextBox2.AppendText(msg); private void button4_Click(object sender, System.EventArgs e) this.richTextBox2.Text=; private void button5_Click(object sender, System.EventArgs e) /获得连接端口 int hostport; try hostport=Int32.Parse(this.textBox6.Text); if(hostport65400)hostport=12800; catch hostport=30000; try /得到需连接的地址 lep = new IPEndPoint(IPAddress.Parse(this.textBox4.Text),hostport); catch(Exception err) MessageBox.Show(err.Message); /构造 socket1 实例 , 并请求连接 socket1= new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); try socket1.Connect(lep); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 14 页 - - - - - - - - - if(socket1.Connected)this.statusBar1.Text=连接成功 ; /开始监听 listenthread=new Thread(new ThreadStart(listenstart); listenthread.Start(); button5.Enabled=false; button3.Enabled=false; catch button5.Enabled=true; button3.Enabled=true; private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) try socket1.Close(); if (this.listenthread!=null) /如果线程还处于运行状态就关闭它 if (this.listenthread.ThreadState=ThreadState.Running) this.listenthread.Abort(); catch 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 14 页 - - - - - - - - -