Diskuze: C# socket server

C# .NET .NET (C# a Visual Basic) C# socket server American English version English version

Avatar
FrKoranda
Člen
Avatar
FrKoranda:

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. února 8:55
Avatar
Odpovídá na FrKoranda
sadlomaslox25:

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

 
Nahoru Odpovědět 5. února 20:42
Avatar
FrKoranda
Člen
Avatar
Odpovídá na sadlomaslox25
FrKoranda:

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. února 15:09
Avatar
Odpovídá na FrKoranda
sadlomaslox25:

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. února 17:28
Avatar
FrKoranda
Člen
Avatar
Odpovídá na sadlomaslox25
FrKoranda:

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. února 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.