Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
FrKoranda
Člen
Avatar
FrKoranda:4.2.2016 8:55

Ahoj, chtěl bych poprosit o radu. Snažím se vytvořit socket server. Na internetu jsem našel různé hotové věci, které jsem použil - viz. První kód níže. Jedná se o konzolovou aplikaci a všechno funguje dobře. Z klienta se připojím a jsem schopen obousměrně posílat zprávy. Problém ale nastal, když jsem se z toho pokusil udělat aplikaci Windows Form - viz. Druhý kód. Pokud jsem měl kód metody Začni() přímo v metodě na obsluhu eventu tlačítka, tak mi to celé zamrzlo. Dočetl jsem se, že bych měl čekat na připojení klienta v druhém vlákně. Po této úpravě už aplikace nezamrzá, nicménně se nemůžu klientem vůbec připojit. Chtěl bych poprosit o radu, co dělám špatně :-)
První kód

static void Main(string[] args)
{
    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.5"), 50));
    socket.Listen(5);
    Socket accepteddata = socket.Accept();
    data = new byte[accepteddata.SendBufferSize];
    int j = accepteddata.Receive(data);
    byte[] adata = new byte[j];
    string dat = Encoding.Default.GetString(adata);
    Console.WriteLine(dat);

    string q = Console.ReadLine();
    data2 = new byte[accepteddata.SendBufferSize];
    data2 = Encoding.Default.GetBytes(q);
    int navrat = accepteddata.Send(data2);
    Console.WriteLine("navratova hodnota ze zaslani: " + navrat);
    Console.ReadLine();

Druhý kód

public partial class Form1 : Form
{
    static byte[] data;
    static Socket socket;
    static Socket accepteddata;
    Thread listenerThread;


    public Form1()
    {
        InitializeComponent();
    }

    private void zacni()
    {
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.5"), 50));
        socket.Listen(5);
        accepteddata = socket.Accept();
        data = new byte[accepteddata.SendBufferSize];
        int j = accepteddata.Receive(data);
        byte[] adata = new byte[j];
        string dat = Encoding.Default.GetString(adata);
    }

    private void button2_Click(object sender, EventArgs e)
    {
       listenerThread =new Thread(zacni);
       listenerThread.Start();
    }
}
 
Odpovědět
4.2.2016 8:55
Avatar
Odpovídá na FrKoranda
sadlomaslox25:5.2.2016 20:42

ten druhy kod mne funguje uplne normalne. muzes napsat co presne ti tam nejde ?

 
Nahoru Odpovědět
5.2.2016 20:42
Avatar
FrKoranda
Člen
Avatar
Odpovídá na sadlomaslox25
FrKoranda:6.2.2016 15:09

On jde pustit, ale nejde se připojit clientem. Na první se po spuštění připojím v pohodě, ale na ten druhý ne. A právě vůbec nevím proč..

 
Nahoru Odpovědět
6.2.2016 15:09
Avatar
Odpovídá na FrKoranda
sadlomaslox25:6.2.2016 17:28

presne k tomu druhemu kodu co jsi sem napsal jsem se uspesne pripojil a poslal si data pomoci tohoto kodu:

private void button1_Click(object sender, EventArgs e)
        {
            Task.Run(() =>
            {
                using (TcpClient cli = new TcpClient("127.0.0.1", 7689))
                {
                    using (var stream = new StreamWriter(cli.GetStream()))
                        stream.Write("ahoj");
                }
            });

jedine co jsem upravil byla ip adresa. pokud jsem chtel prevest prijate data do stringu tak jsem pouzil tohle:

string dat = Encoding.Default.GetString(data, 0, j);

urcite mas vypnuty firewall? je ip spravne? zkusil jsi pustit aplikaci jako spravce ? nemas tam nejaky dalsi kod ktery ti narusuje komunikaci ?

 
Nahoru Odpovědět
6.2.2016 17:28
Avatar
FrKoranda
Člen
Avatar
Odpovídá na sadlomaslox25
FrKoranda:8.2.2016 10:54

zitra se zkusim k serveru pripojit pomoci tveho kodu. Firewall jsem mel zapnuty, me nenapadlo ho vypnout, kdyz uz jsem uspesne komunikoval. To zitra take vyzkousim. Zadny dalsi kod v aplikaci nemam - predpokladam ze komentare nevadi a ani tridy, z kterych neni tvorena zadna instance.

 
Nahoru Odpovědět
8.2.2016 10:54
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.