using System;
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using System.Drawing;
using System.Collections.Concurrent;
using System.Linq;
using System.Threading.Tasks;
namespace ChatApp
{
public partial class Form1 : Form
{
private UdpClient udpClient;
private Thread listenThread;
private bool isConnected = false;
private string myName;
private List<string> connectedIPs;
private NotifyIcon notifyIcon;
public Form1()
{
InitializeComponent();
InitializeNotifyIcon();
connectedIPs = new List<string>();
this.AcceptButton = mesaj_gonder_button; // Klavyede Enter tuşuna basılınca button1'e basılma işlemini gerçekleştirir.
}
private void InitializeNotifyIcon()
{
notifyIcon = new NotifyIcon();
notifyIcon.Icon = SystemIcons.Information;
notifyIcon.Text = "ChatApp";
notifyIcon.Visible = true;
notifyIcon.BalloonTipClicked += NotifyIcon_BalloonTipClicked;
// Bildirime tıklandığında açılacak olan formu belirleyin
notifyIcon.DoubleClick += NotifyIcon_Double_Click;
}
private void NotifyIcon_Double_Click(object sender, EventArgs e)
{
// NotifyIcon'a tıklandığında Form'u tekrar açarız.
this.Show();
}
private void NotifyIcon_BalloonTipClicked(object sender, EventArgs e)
{
// Baloncuk bildirime tıklandığında yapılacak işlemleri burada belirtebilirsiniz.
// Bu örnekte herhangi bir işlem yapmıyoruz.
this.Show();
}
private void Form1_Load_1(object sender, EventArgs e)
{
checkBox1.Checked = true;
string bilgisayarAdi = Dns.GetHostName();
bilgisayar_label.Text = "Bilgisayar Adı: " + bilgisayarAdi;
// Wi-Fi bağlantısı olan bir ağ arıyoruz.
NetworkInterface wifiInterface = null;
foreach (NetworkInterface networkInterface in NetworkInterface.GetAllNetworkInterfaces())
{
if (networkInterface.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 &&
networkInterface.OperationalStatus == OperationalStatus.Up)
{
wifiInterface = networkInterface;
break;
}
}
if (wifiInterface != null)
{
// Wi-Fi arabirimine atanan IPv4 adresini alıyoruz.
foreach (UnicastIPAddressInformation ip in wifiInterface.GetIPProperties().UnicastAddresses)
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
{
ip_bilgisi.Text = ip.Address.ToString();
ip_label.Text = "Wi-Fi IPv4 Adresi: " + ip.Address.ToString();
FindIPAddressesAsync();
return;
}
}
}
// Eğer Wi-Fi bağlantısı yoksa veya IPv4 adresi alınamazsa hata mesajı gösteriyoruz.
ip_label.Text = "Wi-Fi IPv4 Adresi Bulunamadı.";
}
static string kullaniciAdi;
static int port;
private void baglan_button_Click(object sender, EventArgs e)
{
if (!isConnected)
{
try
{
kullaniciAdi = isim_text.Text.Trim(); // Başlangıç ve bitiş boşlukları kaldır
if (string.IsNullOrEmpty(kullaniciAdi))
{
MessageBox.Show("Lütfen İsim Giriniz!");
return;
}
else
{
// İsim başındaki ve sonundaki boşlukları sil
kullaniciAdi = kullaniciAdi.Trim();
port = Convert.ToInt32(port_text.Text);
udpClient = new UdpClient(port);
isConnected = true;
myName = kullaniciAdi; // Değişiklik burada yapıldı
baglan_button.Text = "Bağlantıyı Kes";
listenThread = new Thread(new ThreadStart(ListenForMessages));
listenThread.IsBackground = true;
listenThread.Start();
// KATILMA MESAJI
string message = $"{myName} Sohbete Katıldı!";
byte[] data = Encoding.UTF8.GetBytes(message);
// Diğer cihazın IP adresi ve port numarasını alarak gönderme işlemi yapın.
string ipAddress = ip_text.Text;
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(ipAddress), port);
udpClient.Send(data, data.Length, remoteEP);
mesajlar_list.Items.Add(message);
mesaj_text.Clear();
// KATILMA MESAJI SONU
// Listbox'ı aşağıya kaydıralım.
mesajlar_list.TopIndex = mesajlar_list.Items.Count - 1;
ip_text.Enabled = false;
port_text.Enabled = false;
isim_text.Enabled = false;
}
}
catch (Exception ex)
{
MessageBox.Show("Hata: " + ex.Message);
}
}
else
{
isConnected = true;
myName = kullaniciAdi; // Değişiklik burada yapıldı
// AYRILMA MESAJI
string message = $"{myName} Sohbetten Ayrıldı!";
byte[] data = Encoding.UTF8.GetBytes(message);
// Diğer cihazın IP adresi ve port numarasını alarak gönderme işlemi yapın.
string ipAddress = ip_text.Text;
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(ipAddress), port);
udpClient.Send(data, data.Length, remoteEP);
mesajlar_list.Items.Add(message);
mesaj_text.Clear();
// AYRILMA MESAJI SONU
// Listbox'ı aşağıya kaydıralım.
mesajlar_list.TopIndex = mesajlar_list.Items.Count - 1;
isConnected = false;
udpClient.Close();
baglan_button.Text = "Bağlan";
ip_text.Enabled = true;
port_text.Enabled = true;
isim_text.Enabled = true;
}
}
private void gonder_button_Click(object sender, EventArgs e)
{
if (isConnected)
{
try
{
// Eğer mesaj textbox boş değilse mesajı gönder
if (!string.IsNullOrWhiteSpace(mesaj_text.Text))
{
string message = $"{myName}: {mesaj_text.Text}";
byte[] data = Encoding.UTF8.GetBytes(message);
// Diğer cihazın IP adresi ve port numarasını alarak gönderme işlemi yapın.
string ipAddress = ip_text.Text;
int port = Convert.ToInt32(port_text.Text);
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(ipAddress), port);
udpClient.Send(data, data.Length, remoteEP);
mesajlar_list.Items.Add(message);
mesaj_text.Clear();
// Listbox'ı aşağıya kaydıralım.
mesajlar_list.TopIndex = mesajlar_list.Items.Count - 1;
}
}
catch (Exception ex)
{
MessageBox.Show("Hata: " + ex.Message);
}
}
else
{
MessageBox.Show("Bağlantı yok!");
}
}
private void ListenForMessages()
{
try
{
while (isConnected)
{
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
byte[] data = udpClient.Receive(ref remoteEP);
string message = Encoding.UTF8.GetString(data);
if (message.Contains("(Dosya gönderme)"))
{
// Gelen mesaj bir dosya gönderme mesajı ise, dosyayı alın.
byte[] fileData = udpClient.Receive(ref remoteEP);
// Dosya adını mesajdan alın
string fileName = message.Substring(message.IndexOf(":") + 2);
// Mesajdan "(Dosya gönderme)" kısmını kaldırın
message = message.Replace("(Dosya gönderme)", "").Trim();
if (checkBox1.Checked == true)
{
// Bildirim baloncukta gösterilecek metni ve başlığı ayarlayın.
notifyIcon.BalloonTipTitle = "Yeni Dosya!";
notifyIcon.BalloonTipText = message;
notifyIcon.ShowBalloonTip(3000); // 3 saniye boyunca göster
}
else
{
}
// Listbox'ı aşağıya kaydıralım.
mesajlar_list.TopIndex = mesajlar_list.Items.Count - 1;
// Dosyayı kaydedin
this.Invoke(new MethodInvoker(() =>
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.FileName = fileName;
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
System.IO.File.WriteAllBytes(saveFileDialog.FileName, fileData);
}
mesajlar_list.Items.Add(message + " - Alındı");
}));
}
else
{
// Diğer durumlarda normal mesajı alın.
this.Invoke(new MethodInvoker(() =>
{
mesajlar_list.Items.Add(message);
if (checkBox1.Checked)
{
// Bildirim baloncukta gösterilecek metni ve başlığı ayarlayın.
notifyIcon.BalloonTipTitle = "Yeni Mesaj!";
notifyIcon.BalloonTipText = message;
notifyIcon.ShowBalloonTip(3000); // 3 saniye boyunca göster
}
// Listbox'ı aşağıya kaydıralım.
mesajlar_list.TopIndex = mesajlar_list.Items.Count - 1;
}));
}
}
}
catch (SocketException)
{
// Soket kapatıldı, dinleme sona erdi.
}
}
private async void FindIPAddressesAsync()
{
Ping P = new Ping();
int a = 100;
int b = 255;
int online = 0;
online_label.Text = "Online: " + online.ToString();
string ip_ilgisi = ip_bilgisi.Text.Substring(0, ip_bilgisi.Text.LastIndexOf('.'));
// Listeyi temizleyin, böylece her tetiklendiğinde önceki IP adreslerini kaldırmış olursunuz.
cihazlar_list.Items.Clear();
for (int i = a; i <= b; i++)
{
string sonuc = ip_ilgisi + "." + i.ToString();
IPAddress my = IPAddress.Parse(sonuc);
try
{
PingReply cevap = await P.SendPingAsync(my);
if (cevap.Status == IPStatus.Success)
{
cihazlar_list.Items.Add(sonuc);
online++;
online_label.Text = "Online: " + online.ToString();
}
else
{
cihazlar_list.Items.Add("-------");
online_label.Text = "Online: " + online.ToString();
}
}
catch (Exception ex)
{
cihazlar_list.Items.Add("Hata: " + ex.Message);
}
}
}
private void yenile_button_Click(object sender, EventArgs e)
{
FindIPAddressesAsync();
}
private void dosya_gonder_buton_Click(object sender, EventArgs e)
{
if (isConnected)
{
try
{
OpenFileDialog openFileDialog = new OpenFileDialog();
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string filePath = openFileDialog.FileName;
byte[] fileData = System.IO.File.ReadAllBytes(filePath);
// Dosyanın adını alarak gönderme işlemini yapın.
string fileName = System.IO.Path.GetFileName(filePath);
string message = $"{myName}: (Dosya gönderme) {fileName}";
byte[] messageData = Encoding.UTF8.GetBytes(message);
string ipAddress = ip_text.Text;
int port = Convert.ToInt32(port_text.Text);
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(ipAddress), port);
// Önce mesajı gönderin
udpClient.Send(messageData, messageData.Length, remoteEP);
// Ardından dosyayı gönderin
udpClient.Send(fileData, fileData.Length, remoteEP);
mesajlar_list.Items.Add(message);
}
}
catch (Exception ex)
{
MessageBox.Show("Hata: " + ex.Message);
}
}
else
{
MessageBox.Show("Bağlantı yok!");
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true; // Form kapatmayı iptal eder
this.Hide(); // Formu gizler
}
private void isim_text_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
}
private void isim_text_TextChanged(object sender, EventArgs e)
{
karakter_sayisi_label.Visible = true;
// İsim_text TextBox'ındaki metni alın ve toplam karakter sayısını hesaplayın.
string text = isim_text.Text;
int characterCount = text.Length;
if (characterCount > 20)
{
// Eğer 20 karakterden fazlaysa, fazla karakterleri silerek 20 karaktere düşürün.
isim_text.Text = text.Substring(0, 20);
karakter_sayisi_label.Text = "20/20";
}
else
{
// Toplam karakter sayısını bir Label'a yazdırın.
karakter_sayisi_label.Text = characterCount + "/20";
}
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked)
{
checkBox1.Text = "Bildirimler Açık!";
}
else
{
checkBox1.Text = "Bildirimler Kapalı!";
}
}
}
}