Sockets w aplikacji

Sockets w aplikacji
F2
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 lat
  • Postów:5
0

Witam,
potrzebuję prostej aplikacji wykorzystującej windows sockets. Aplikacja a wysyłać komendy telenet do serwera na odpowiedni porcie. Jest to serwer automatyki domowej a ja chcę zrobić mały panel dotykowy.

Założenie jest takie, że po uruchomieniu aplikacji łączy się ona z serwerem a pod poszczególnymi przyciskami są zakodowane instrukcje.Moja widza programistyczna jest zerowa. Udało mi się jednak z pomocą kilku tutoriali rozwiązać łączenie się natomiast przesyłanie komend nie działa.

Kopiuj
 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.Sockets;

namespace WindowsFormsApplication7
{
    public partial class Form1 : Form
    {
        System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            clientSocket.Connect("172.16.135.130", 6860);
            label1.Text = "Client Socket Program - Server Connected ...";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            NetworkStream serverStream = clientSocket.GetStream();

            byte[] outStream = System.Text.Encoding.ASCII.GetBytes("#GET G:"gbnusss" END");

            serverStream.Write(outStream, 0, outStream.Length);

            serverStream.Flush();



        
        }
    }
}

Komenda musi być wysyłana w formie

Kopiuj
#GET
G:"sciezka"
END

Czy ktoś mógłby mnie poratować gotowcem, bądź tłumaczeniem krok po kroku. Podejrzewam, że dla osoby obeznanej z programowaniem jest to jedna z podstaw.
Jeśli będzie potrzeba mogę zlecić odpłatne przygotowanie szablonu. Zależy mi na czasie.

Z góry dziękuję

edytowany 1x, ostatnio: ŁF
xeo545x39
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Kosmos
  • Postów:1571
0

Nie działa - cóż to znaczy? Jakiś wyjątek? Serwer nie odbiera danych?


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
DibbyDum
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Polska, Kraków
0
Kopiuj
byte[] outStream = System.Text.Encoding.ASCII.GetBytes("#GET G:"gbnusss" END");

Te poszczególne komendy nie powinny być od siebie odseparowane np. znakiem nowej linii?


Yubby dibby dibby dibby dibby dibby dibby dum..
ŁF
To się nawet nie skompiluje.
DibbyDum
Nie zwróciłem uwagi że ma cudzysłowy w string.
F2
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 lat
  • Postów:5
0
xeo545x39 napisał(a):

Nie działa - cóż to znaczy? Jakiś wyjątek? Serwer nie odbiera danych?

Serwer nie odbiera danych

DibbyDum napisał(a):
Kopiuj
byte[] outStream = System.Text.Encoding.ASCII.GetBytes("#GET G:"gbnusss" END");

Te poszczególne komendy nie powinny być od siebie odseparowane np. znakiem nowej linii?

Tak, komendy powinny byc zakonczone nową linią czy mam to zrobić w taki sposób:

Kopiuj
byte[] outStream = System.Text.Encoding.ASCII.GetBytes("#GET\r\nG:"gbnusss"\r\nEND"); 

Wyszukałem specyfikację połączenia:

Port number- The Windows socket connection uses port 6860.
Type of data exchange - The text data strings defined in the protocol are sent via the Windows socket connection

The TP Com service waits for incoming TCP/IP telegrams to a defined port. The default value
for the port is 6860. A Windows socket connection is opened for data exchange.
The default value of the receive and send buffer length of the Windows socket is 1,500 bytes. In the TP Com service, a so-called session is started for each established Window socket connection; this session manages the set configuration of each connection separately.
If a message is received from the TP Com interface and exceeds the set buffer (memory for clipboarding data), the request is not executed and an error response is issued instead. The next valid request message (starting with #) is used.A message does not necessarily have to be sent with a single TCP/IP telegram. Fragmenting of the
messages is normal, especially if the message length exceeds the MTU (Maximum Transmission Unit, corresponds to the maximum package size).

Communication via TCP/IP is basically asynchronous and bidirectional

the preset codepage is 1252 Western European (Windows).

Zastanawia mnie jeszcze kodowanie. W przykładzie, który ja znalazłem jest ASCII a powinno być Windows1252. Jednak nie widzę takiego kodowania tutaj:

https://msdn.microsoft.com/pl-pl/library/ds4kkd55(v=vs.110).aspx

ŁF
Być może samo \n - sprawdź w dokumentacji urządzenia, z którym gadasz.
SO
  • Rejestracja:ponad 10 lat
  • Ostatnio:około rok
0
filu25 napisał(a):

Zastanawia mnie jeszcze kodowanie. W przykładzie, który ja znalazłem jest ASCII a powinno być Windows1252. Jednak nie widzę takiego kodowania tutaj:

https://msdn.microsoft.com/pl-pl/library/ds4kkd55(v=vs.110).aspx

Spróbuj

Kopiuj
Encoding.GetEncoding("Windows-1252").GetBytes(...) 
F2
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 lat
  • Postów:5
0

Dziękuję za wszystkie podpowiedzi jednak nic nie pomogło. Zastanawiam się czy w ogóle w odpowiedni sposób próbuję przesłać komendy. Jeśli łączę się do serwera przez telnet to dostaję odpowiedź (informację o błędzie) nawet na losowy ciąg znaków. Przy próbie wysłania z programu nic.

Czy można w sposób taki jak potrzebuję - zakodowanie pod przyciskiem - przesyłać komendy telnet?

ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:7 dni
0

Tylko zapisujesz, więc nie masz skąd dostać odpowiedzi z błędem - bo trzeba by ją odczytać.

Windows-1252, ASCII, UTF-8 to identyczne kodowanie w zakresie znaków 0-127, dopóki nie przesyłasz znaków powyżej 127 możesz się nie martwić stroną kodową.


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.