程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> p2p聊天系統(北大青鳥大二寒假作業)

p2p聊天系統(北大青鳥大二寒假作業)

編輯:.NET實例教程

P2P聊天系統 北大青鳥 大二寒假作業 主要涉及 線程池 不規則窗體 winsock編程 soket

源代碼如下

 



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Collections;


namespace chating
...{
    public partial class chatingto : Form
    ...{

        private bool ismousedown = false;
        private Point position;
        private Thread beginlistening;
        private frmlogin lg;
        private NetworkStream netstream;
        private Socket soc;
        public delegate void DelgMsgListened();
        private int count;
        private String message;
        private TcpListener server;
        public ArrayList threadslist;
        public Thread[] allthread;

        public chatingto()
        ...{
            //關閉線程安全檢查
            Control.CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            //實例化監聽線程
            beginlistening = new Thread(new ThreadStart(listening));
            allthread = new Thread[5];
        }
        //監聽方法
        private void listening()
        ...{
            
            count = 0;
            server = new TcpListener(Dns.GetHostEntry(Dns.GetHostName()).AddressList[0], 85);
            try
            ...{
                server.Start();
            }
            catch (Exception ex)
            ...{
                Console.WriteLine(ex.Message);
            }
            //循環接受客戶端連接
            while (count < 5)
            ...{
                try
                ...{
                    soc = server.AcceptSocket();
                }
                catch (Exception ex)
                ...{
                    Console.WriteLine(ex.Message);
                }
                //啟動聊天線程
                allthread[count] = new Thread(new ParameterizedThreadStart(beginchat));
                allthread[count].Start(soc);
                count++;
            }

        }
        //聊天方法
        private void beginchat(object socket)
        ...{
            Socket soc = (Socket)socket;
            lisMessage.Items.Add(lg.username + "已經進入了聊天");
            while (true)
            ...{
                byte[] stream = new byte[80];
                int i = soc.Receive(stream);
                //檢測客戶端是否退出
                if (i < 1)
                ...{
                    lisMessage.Items.Add(lg.username + "已經退出了聊天");
                    break;
                }
                message = Encoding.UTF8.GetString(stream);
                lisMessage.Items.Add(message);
            }
        }
        //解決不規則窗體的移動
        private void chatingto_MouseDown(object sender, MouseEventArgs e)
        ...{
            if (e.Button == MouseButtons.Left)
            ...{
                int x = -e.X;
                int y = -e.Y;
                position = new Point(x, y);
                ismousedown = true;
            }
        }

        private void chatingto_MouseMove(object sender, MouseEventArgs e)
        ...{
            if (ismousedown)
            ...{
                Point newposition = Control.MousePosition;
                newposition.Offset(position);
                this.Location = newposition;
            }
        }

        private void chatingto_MouseUp(object sender, MouseEventArgs e)
        ...{
            if (e.Button == MouseButtons.Left)
            ...{
                ismousedown = false;
            }
        }
        //退出是關閉資源
        private void btnexit_Click(object sender, EventArgs e)
        ...{
            server.Stop();
            beginlistening.Abort();
            Application.Exit();
        }
        //連接服務器並且設置按鈕的狀態
        private void btnconnect_Click(object sender, EventArgs e)
        ...{
            //實例化登陸框
            lg = new frmlogin();
            lg.ShowDialog();
            //設置按鈕狀態
            btnconnect.Enabled = false;
            btndisconnect.Enabled = true;
            btnsend.Enabled = true;
            btnexit.Enabled = false;

        }

        private void chatingto_Load(object sender, EventArgs e)
        ...{
            //監聽線程開始
            beginlistening.Start();
        }

        private void btnsend_Click(object sender, EventArgs e)
        ...{
            //向服務器發送消息
            if (txtsendtxt.Text.Equals(""))
            ...{
                MessageBox.Show("發送的內容不能為空!");
                return;
            }
            lisMessage.Items.Add(lg.username + txtsendtxt.Text);
            byte[] sendtext = Encoding.UTF8.GetBytes(lg.username + txtsendtxt.Text);
            netstream = lg.clIEnt.GetStream();
            netstream.Write(sendtext, 0, sendtext.Length);
            txtsendtxt.Text = "";
        }
        //斷開連接
        private void btndisconnect_Click(object sender, EventArgs e)
        ...{
            netstream.Close();
            lg.clIEnt.Close();
            btndisconnect.Enabled = false;
            btnsend.Enabled = false;
            btnconnect.Enabled = true;
            btnexit.Enabled = true;
        }
    }
}

 

 

登陸窗體:

 



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;

namespace chating
...{
    public partial class frmlogin : Form
    ...{
        public  string username;
        private bool ismousedown=false;
        private Point position;
       &nbsp;public TcpClient clIEnt;
        public frmlogin()
        ...{
            InitializeComponent();
        }
        //不規則窗體的移動
        private void frmlogin_MouseDown(object sender, MouseEventArgs e)
        ...{
            if(e.Button==MouseButtons.Left)
            ...{
                int x = -e.X;
                int y = -e.Y;
                position = new Point(x, y);
                ismousedown = true;
               
            }
        }

        private void frmlogin_MouseMove(object sender, MouseEventArgs e)
        ...{
            if(ismousedown)
            ...{
                Point newposition = Control.MousePosition;
                newposition.Offset(position);
                this.Location = newposition;
            }
        }

        private void frmlogin_MouseUp(object sender, MouseEventArgs e)
        ...{
            if(e.Button==MouseButtons.Left)
            ...{
                ismousedown = false;
            }
        }
        //連接服務器
        private void btnconnect_Click(object sender, EventArgs e)
        ...{
            username = txtname.Text+":";
            client = new TcpClIEnt();
            try
            ...{
                clIEnt.Connect(IPAddress.Parse(txtaddress.Text), 85);
            }
            catch(Exception ex)
            ...{
                Console.WriteLine("連接錯誤:" + ex.Message);
                return;
            }
            this.Close();
        }
    }
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved