iT邦幫忙

0

C# 想要將程式改寫成可以用telnet連線執行

各位好

小弟剛學程式設計
有一個需求不知道該如何處理
下面是溫度轉換,可以執行
但是想要讓程式可以用telnet連線執行
不知道該怎麼做

google了一些socket程式,但執行後只能listen,用telnet建立連線
無法做到執行溫度轉換那段

希望指教
謝謝

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            String str;
            Console.WriteLine("CelsiusToFahrenheit: ");
            str = Console.ReadLine();
            Console.WriteLine(CelsiusToFahrenheit(str));
            Console.WriteLine("按任意鍵結束....");
            Console.ReadKey();  //可按任意鍵結束畫面
        }
        public static double CelsiusToFahrenheit(string temperatureCelsius)
        {
            double celsius = System.Double.Parse(temperatureCelsius);
            return (celsius * 9 / 5) + 32;
        }
    }
}
echochio iT邦高手 1 級 ‧ 2019-12-18 17:42:59 檢舉
您要不要改成如同 WEB API 一樣
80 port , 網址 傳入 json , 回應 json ......
這樣比較實用 .......
1
huanwen
iT邦新手 5 級 ‧ 2019-12-17 23:58:21
最佳解答

試試這樣寫,不知道有沒有回答到你,telnet預設是23port

public static void Main(String[] args)
    {
        string data = "";
        byte[] bytes = new Byte[1];

        IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 23);

        Socket listener = new Socket(ipAddress.AddressFamily,
            SocketType.Stream, ProtocolType.Tcp);

        listener.Bind(localEndPoint);
        listener.Listen(10);
        
        while (true)
        {
            Console.WriteLine("Waiting for a connection...");
            Socket handler = listener.Accept();
            bool isExit = false;

            while (true)
            {
                handler.Send(Encoding.ASCII.GetBytes("Send: "));
                while (true)
                {
                    int bytesRec = handler.Receive(bytes, 1, SocketFlags.None);
                    Console.WriteLine(bytes[0]);

                    if (bytes[0] == 13) // enter
                    {
                        break;
                    }
                    else if (bytes[0] == 3) // ctrl + c
                    {
                        isExit = true;
                        break;
                    }
                    else if (bytes[0] == 8) // backspace
                    {
                        handler.Send(new byte[] { 32, 8 });
                    }
                    else
                    {
                        data += Encoding.ASCII.GetString(bytes);
                    }
                }

                if (isExit)
                {
                    break;
                }

                var result = CelsiusToFahrenheit(data);
                handler.Send(Encoding.ASCII.GetBytes(string.Format("Result: {0:0.00}\n", result)));
                handler.Send(new byte[] { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 });
                data = "";
            }

            handler.Send(Encoding.ASCII.GetBytes("Exit"));
            handler.Shutdown(SocketShutdown.Both);
            handler.Close();
        }
    }
看更多先前的回應...收起先前的回應...
fillano iT邦超人 1 級 ‧ 2019-12-18 10:13:44 檢舉

完美!只是backspace沒處理data...不過這點小事給問問題的人處理就可以了XD

fillano iT邦超人 1 級 ‧ 2019-12-18 11:02:18 檢舉

另外,那一串new byte {8, 8, 8, 8...}如果是為了回到行首,直接送CR比較簡單吧?

huanwen iT邦新手 5 級 ‧ 2019-12-18 23:00:45 檢舉

感謝大大指點,原來只要在印出Result的最後面改成\r\n就行了XD

johnqq iT邦新手 5 級 ‧ 2019-12-19 17:42:58 檢舉

大大們好

最後我改成以下程式碼

原本還在想兩個問題
1."backspace沒處理data"
2.new byte {8, 8, 8, 8...}是什麼意思
然後看著我的鍵盤,突然恍然大悟,原來是同一件事,是倒退鍵的意思

比較遺憾的是以前的程式碼忘了,不然印象中我只有加listen port幾段,就可以達到相同功能

感謝大大們的指教

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string data = "";
            byte[] bytes = new Byte[1];

            IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 23);

            Socket listener = new Socket(ipAddress.AddressFamily, 
                SocketType.Stream, ProtocolType.Tcp);

            listener.Bind(localEndPoint);
            listener.Listen(10);

            while (true)
            {
                Console.WriteLine("Waiting for a connection..."); //server顯示訊息
                Socket handler = listener.Accept(); //執行後停在這裡等待client連入後才會往下走
                bool isExit = false;

                while (true)
                {

                    handler.Send(Encoding.ASCII.GetBytes("Send: ")); //client顯示訊息
                    while (true)
                    {
                        int bytesRec = handler.Receive(bytes, 1, SocketFlags.None); //等待client輸入後才會往下走(輸入一個按鍵後就會往下check, 確認不是指定的字元才會讓你輸入第二個按鍵)
                        Console.WriteLine(bytes[0]);

                        //check輸入的按鍵是否為enter or ctrl+c or backspace, 成立則結束輸入, 開始執行後續的計算
                        if (bytes[0] == 13) // enter
                        {
                            break;
                        }
                        else if (bytes[0] == 3) // ctrl + c
                        {
                            isExit = true;
                            break;
                        }
                        else if (bytes[0] == 8) // backspace
                        {
                            handler.Send(new byte[] { 32, 8 });
                        }
                        else
                        {
                            data += Encoding.ASCII.GetString(bytes);
                        }
                    }

                    if (isExit)
                    {
                        break;
                    }

                    var result = CelsiusToFahrenheit(data);
                    handler.Send(Encoding.ASCII.GetBytes(string.Format(Environment.NewLine))); //client顯示訊息
                    handler.Send(Encoding.ASCII.GetBytes(string.Format("Result: {0:0.00}\r\n", result))); //client顯示訊息
                    handler.Send(Encoding.ASCII.GetBytes(string.Format(Environment.NewLine))); //client顯示訊息
                    data = "";
                }

                handler.Send(Encoding.ASCII.GetBytes("Exit"));
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();
            }
        }
        public static double CelsiusToFahrenheit(string temperatureCelsius)
        {
            double celsius = System.Double.Parse(temperatureCelsius);
            return (celsius * 9 / 5) + 32;
        }
    }
}

0
小魚
iT邦大師 1 級 ‧ 2019-12-17 13:37:56

你是要用cmd執行嗎?
那你要帶參數進去喔.
關於C#控制台傳遞參數和接收參數

下面是個簡單的範例

using System;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("參數個數:"+args.Length);
            string text = "";
            for(int i=0;i<args.Length;i++)
            {
                if (i > 0)
                    text += ", ";
                text += args[i];
            }
            Console.WriteLine("參數:"+ text);
            Console.WriteLine("請按任意鍵繼續");
            Console.ReadKey();
        }
    }
}

命令提示字元
ConsoleTest 123 435 321
https://ithelp.ithome.com.tw/upload/images/20191217/20105694cZLZ8DQOnI.png

fillano iT邦超人 1 級 ‧ 2019-12-17 13:52:04 檢舉

我想他要做的是用socket聆聽某個port,然後用telnet連上時,可以輸入攝氏度後,返回對應的華氏度,然後結束執行。

小魚 iT邦大師 1 級 ‧ 2019-12-17 13:59:15 檢舉

喔喔,
可以這樣子嗎?
我沒這樣寫過.

johnqq iT邦新手 5 級 ‧ 2019-12-17 15:10:50 檢舉

抱歉
主要是以前有寫過,但是程式碼弄丟了
當時只是寫了一隻簡單的小程式
在同事的程式碼發現了開port聆聽的幾段程式碼(我記得只有三小段)
我使用了之後,意外發現可以telnet到我的小程式,並執行

因為忘了做法,可能開port的程式碼不只三段吧
查了好久都是好多段程式碼,有關socket、listener
因為不熟悉程式設計,所以才po上來問問

由於當時我確實是這樣用telnet執行程式的,確定可以這樣使用沒錯

感謝各位指教

0
c123456789q
iT邦新手 5 級 ‧ 2019-12-17 14:25:37

要做到的其實蠻簡單的,首先你要先
1.在目標電腦上開啟telnet server的功能
2.在使用的電腦上撰寫python程式連線1.然後執行上方回覆的cmd程式
3.在python程式抓取剛剛的執行結果

如果是c#自己本身要做到的話,你就是得寫兩個程式一個是client一個是server,然後當client連進來的時候,在等候client再送一次資料進來,然後server接受這個資料,算出溫度後,把資料丟到client
整體架構其實和很容易找到的範例程式“聊天室”有點像,可以參考看看

froce iT邦大師 1 級 ‧ 2019-12-17 16:34:32 檢舉

我倒是有用python和powershell寫過,python是server,powershell是client。XD
其實不難,難的是如果你還要做啥遠端操作。

我要發表回答

立即登入回答