Top.Mail.Ru
Ответы

C# Visual 2010 Express --> Как отправить информацию с одного компьютера на другой НЕ в локальной сети?

Как средствами "C#" передать текстовую информацию (возможно, txt файлы) между двумя НЕ локальными компьютерами?
Слышал, что-то из этой области: сокеты, потоки.. .
Набросал что-то по-быстрому, но не работает даже в локалке.. .
-----------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace Danchik_s_Progs
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

TcpListener tcplistener;
TcpClient tcpclient, tcpsender;
NetworkStream readstream, writestream;
StreamReader reader;
StreamWriter writer;
String str;

private void Form1_Load(object sender, EventArgs e)
{

}

private void button1_Click(object sender, EventArgs e)
{
tcplistener = new TcpListener(IPAddress.Loopback, Convert.ToInt32(textBox1.Text));
tcplistener.Start();
backgroundWorker1.RunWorkerAsync();
button1.Enabled = false;
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
tcpclient = tcplistener.AcceptTcpClient();
readstream = tcpclient.GetStream();
reader = new StreamReader(readstream);
str = reader.ReadToEnd();
reader.Close();
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
listBox1.Items.Add(str);
backgroundWorker1.RunWorkerAsync();
}

private void button2_Click(object sender, EventArgs e)
{
tcpsender = new TcpClient();
tcpsender.Connect("[IP компа] ", Convert.ToInt32(textBox2.Text));
writestream = tcpsender.GetStream();
writer = new StreamWriter(writestream);
writer.Write(textBox3.Text);
listBox1.Items.Add( textBox3.Text);
writer.Close();
}
}
}
Есть 2 textBox'а для портов и кнопка "Слушать". Естественно, listBox, еще один textBox и кнопка "Отправить"
-------------------------------
P.S. Не ругайтесь, если вопрос дурацкий. Я еще совсем новичок в C#.

Дополнен

Забыл добавить, что есть еще и backgroundWorker

Дополнен

Ленчик, для обучения. К тому же некоторые пользователи не умеют пользоваться файлообменниками и почтой (я не про себя =)
)

Дополнен

Enter_prise, спасибо за идею, но все-таки вариант Сергея мне понравился больше т. к. в этом случае не требуется обращаться к другим сервисам.

Дополнен

Сергей Одиноков, спасибо за полный ответ! Вы подали мне хорошую идею. Но вот с "не указывается порт, никто ни к кому не подключится" я не согласен, пользователи вручную вводят "перекрестные "порты в textBox2 и textBox2 Или я все-таки чего-то не понимаю? А предложение "Иначе все выльется в деньги" мне вообще не понятно. Просто я не собираюсь пользоваться любыми сторонними услугами. На счет "А пример не работает потому, что сервер у вас слушает "петлю" (лупбэк) , а не 127.0.0.1" я могу сказать, что я сделал 2 копии программы, но с "перекрестнымы" IP Вы это имели ввиду?
P.S. На своем компьютере запустил 2 таких программы, указал порты и все-таки смог пообщаться сам с собой =) При этом в них был указан мой локальный ИП, что логично

По дате
По рейтингу
Аватар пользователя
Новичок
12лет

Это вопрос даже не про С#, а вообще про архитектуру сетевых программ.
Основная проблема кроется в том, что в интернете между двумя хостами, которым нужно соединиться друг с другом, существует множество преград. Конечно же, есть способы по преодолению этих преград (например, которые используются в скайпе, в торрентах) , но они чрезвычайно сложны.

В вашем случае можно организовать простейшую клиент-серверную архитектуру: у нас есть один программа-сервер, которая будет принимать на себя подключения пользователей и которая будет работать как промежуточное звено между ними. Чтобы пользователи могли к нему подключиться, нам нужно, чтобы у компьютера, на котором он запущен, был "белый ИП". Его можно оформить либо у провайдера как дополнительную услугу, либо взять в аренду виртуальный сервер (значительно дороже) .
Клиенты будут подключаться к этому серверу, отсылать ему запросы, которые тот будет перенаправлять другим пользователям.

К чему я это пишу. Лучше начните с простого чата, который будет работать по локалке :) Иначе все выльется в деньги.

ПС. А пример не работает потому, что сервер у вас слушает "петлю" (лупбэк) , а не 127.0.0.1 Из-за этого, и еще из-за того, что не указывается порт, никто ни к кому не подключится.

Аватар пользователя
Мыслитель
12лет

Предположим, что программа передает какие-то данные другой по TCP-протоколу. Для того, чтобы достучаться до какого-либо компьютера через интернет, у него должен быть "белый" (или статический) IP. Это в сетях часто платно, ибо адрес IPv4 уже дефицит, на каждую микроволновку не повесишь.

Можно и бесплатно с помощью доменного имени и такой ерундени, как DDNS или Dynamic DNS.
Например, здесь: www . noip . com
Достаточно ссылаться на выданный этим сервисом домен, а IP он разрешит самостоятельно. Но для этого необходимо будет установить программу, которая будет мояковать сервису о текущем адресе.

Аватар пользователя
Оракул
12лет

Тебе для дела, или для обучения?
Если ты учишься, то я скажу так - не знаю.
А если для дела, то не морочь голову, делай своей прогой файлы и отправляй их почтой. Или через файлообменник, если большие.