.NET 4.x Переделать клиент-серверное приложение - C#
Формулировка задачи:
Не знаю, как правильно сформулировать вопрос...
Суть такова: нашел я пример клиент-серверного приложения(чат), всего на 2 пользователя. Только это все в одном приложении.
1 из пользователей использует его в качестве сервера, а другой подключается к нему. Но это все работает только по локалке.
Помогите мне переписать код, что бы можно было юзать не по локалке. Заранее спасибо!
Решение задачи: «.NET 4.x Переделать клиент-серверное приложение»
textual
Листинг программы
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 System.Net;
using System.Net.Sockets;
using System.IO;
namespace CS_tutorial
{
public partial class Form1 : Form
{
private TcpClient client;
public StreamReader STR;
public StreamWriter STW;
public string recieve;
public String text_to_send;
public bool working;
public Form1()
{
InitializeComponent();
IPAddress[] localIP = Dns.GetHostAddresses(Dns.GetHostName());
foreach (IPAddress address in localIP)
{
if (address.AddressFamily == AddressFamily.InterNetwork)
{
textBox3.Text = address.ToString();
textBox4.Text = "25225";
}
}
working = false;
}
private void button2_Click(object sender, EventArgs e)
{
working = true;
button2.Enabled = false;
TcpListener listener = new TcpListener(IPAddress.Any, int.Parse(textBox4.Text));
listener.Start();
client = listener.AcceptTcpClient();
STR = new StreamReader(client.GetStream());
STW = new StreamWriter(client.GetStream());
STW.AutoFlush = true;
backgroundWorker1.RunWorkerAsync();
backgroundWorker2.WorkerSupportsCancellation = true;
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (client.Connected)
{
try
{
recieve = STR.ReadLine();
this.textBox2.Invoke(new MethodInvoker(delegate() { textBox2.AppendText("You: " + recieve + "\n"); }));
if (String.IsNullOrEmpty(recieve))
break;
recieve = "";
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
if (client.Connected)
{
STW.WriteLine(text_to_send);
this.textBox2.Invoke(new MethodInvoker(delegate() { textBox2.AppendText("Me: " + text_to_send + "\n"); }));
}
else
{
MessageBox.Show("Send failed!");
}
backgroundWorker2.CancelAsync();
}
private void button3_Click(object sender, EventArgs e)
{
working = true;
backgroundWorker1.WorkerSupportsCancellation = true;
client = new TcpClient();
IPEndPoint IP_End = new IPEndPoint(IPAddress.Parse(textBox3.Text), int.Parse(textBox4.Text));
try
{
client.Connect(IP_End);
if (client.Connected)
{
textBox2.AppendText("Connected to server" + "\n");
STW = new StreamWriter(client.GetStream());
STR = new StreamReader(client.GetStream());
STW.AutoFlush = true;
backgroundWorker1.RunWorkerAsync();
backgroundWorker2.WorkerSupportsCancellation = true;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text != "")
{
text_to_send = textBox1.Text;
backgroundWorker2.RunWorkerAsync();
}
textBox1.Text = "";
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (working == true)
{
//client.Close();
//STR.Close();
STW.Close();
}
}
}
}