목차
问题内容
解决方法
백엔드 개발 Golang go와 C# 콘솔 애플리케이션 간에 장기 파이프 연결을 설정하는 방법

go와 C# 콘솔 애플리케이션 간에 장기 파이프 연결을 설정하는 방법

Feb 13, 2024 pm 10:50 PM
크로스 플랫폼 애플리케이션

go와 C# 콘솔 애플리케이션 간에 장기 파이프 연결을 설정하는 방법

php小编新一为您介绍如何在Go和C#控制台应用程序之间建立长期管道连接。在开发跨平台应用程序时,Go和C#是两种常用的编程语言。建立管道连接可以实现两种语言之间的通信和数据交换。本文将介绍如何使用Go和C#的相关库和API来建立稳定、可靠的长期管道连接,以便实现数据的传输和交互。无论您是Go开发者还是C#开发者,通过本文的指导,您都可以轻松地在两种语言之间建立管道连接,实现应用程序的功能需求。

问题内容

我有非常简单的 C# 控制台应用程序。这将是一个添加从 go 部分传递的 double 变量的过程。

double sum = 0;
bool flag = true;

while(flag) {  // exit on convert error
    var str = Console.ReadLine(); // ask string 

    double addend;
    flag = double.TryParse(str, out addend); // convert to double

    sum += flag ? addend : 0;  //add on success
    Console.WriteLine(sum);
}

return 0;
로그인 후 복사

我的 go 部分也很简单。它使用以前的控制台应用程序创建进程,向其发送字符串并读回结果。

package main

import (
    "fmt"
    "io"
    "log"
    "os/exec"
)

func main() {

    cmd := exec.Command("%path to app%\\ConsoleApp.exe") // process that will be started
    
stdout, err := cmd.StdoutPipe() // use std out pipe
    if err != nil {
        log.Fatal(err)
    }

    stdin, err := cmd.StdinPipe() // use std in pipe
    if err != nil {
        log.Fatal(err)
    }

    if err := cmd.Start(); err != nil { // start
        log.Fatal(err)
    }

    for true {
        var w1 string
        _, err := fmt.Scanln(&w1) // read line

        if err != nil {
            log.Fatal()
        }

        go func() {
            io.WriteString(stdin, w1) // pass it to console app
        }()

        read, err := io.ReadAll(stdout) // read result

        fmt.Println(read)

        if err != nil {
            log.Fatal()
        }
    }
}
로그인 후 복사

我开始调试控制台应用程序的进程(它出现在任务管理器、RMC - 调试中),但存在符号错误,所以我什至无法理解我的应用程序是否获取了字符串。

这只是我的麻烦的一半。我认为我的控制台应用程序有一两次收到字符串(我的意思是以前的时间),但只有第一个,导致管道在传输/复制后关闭。那么我该如何控制呢?我想要执行多个事务、写入和读取,并仅在需要时关闭管道。

编辑:我对 ConsoleApp 做了一些更改。现在看起来像这样:

double sum = 0;
bool flag = true;
while(flag) {
    var str = Console.ReadLine();
    double addend;
    flag = double.TryParse(str, out addend);

    // File creation will indicate that message was recieved. 
    using(StreamWriter writer = new StreamWriter("t.txt")) { 
        writer.WriteLine($"{flag}");
    }

    sum += flag ? addend : 0;
    Console.WriteLine(sum);
}

return 0;
로그인 후 복사

解决方法

所以,@maxm 非常接近(或者甚至已经找到了解决方案,但它对我不起作用,fsr)。

执行部分:

package main

import (
    "bufio"
    "fmt"
    "log"

    "os/exec"
)

func main() {
    cmd := exec.Command("%path to the exe%")

    stdout, err := cmd.StdoutPipe() 
    if err != nil {
        log.Fatal(err)
    }

    stderr, err := cmd.StderrPipe()
    if err != nil {
        log.Fatal(err)
    }

    scanner := bufio.NewScanner(stdout)

    stdin, err := cmd.StdinPipe()
    if err != nil {
        log.Fatal(err)
    }

    if err := cmd.Start(); err != nil {
        log.Fatal(err)
    }

    for {
        var w1 string
        _, err := fmt.Scanln(&w1)
        w2 := []byte(w1) // important! You need convert string to byte array

        if err != nil {
            log.Fatal()
        }

        if _, err := stdin.Write(w2); err != nil { // pass byte array
            log.Fatal(stderr)
            panic(err)
        } 

        if scanner.Scan() {
            read := scanner.Text()
            fmt.Println(read)
        } else {
            if err := scanner.Err(); err != nil {
                panic(err)
            }
        }
    }
}
로그인 후 복사

C# 部分非常简单。首先,您需要从字节数组恢复字符串:

public static string ByteArrayToString(this byte[] byteArray, int size) {
    // get decoder to decode input encoding
    var decoder = Console.InputEncoding.GetDecoder(); 

    // count char that will be restored
    int charCount = decoder.GetCharCount(byteArray, 0, size);

    // initialize char array
    char[] charArray = new char[charCount];
    // restore to char array
    decoder.GetChars(byteArray, 0, size, charArray, 0);

    // get and return string from our char array
    return new string(charArray);
}
로그인 후 복사

接下来是主要部分:

double sum = 0;
bool flag = true;
while(flag) {
    string str;

    using Stream stdin = Console.OpenStandardInput(); // for reading 

    byte[] buffer = new byte[2048];
    int bytes = 0; // bytes count

    while((bytes = stdin.Read(buffer, 0, buffer.Length)) > 0) { // read
        str = buffer.ByteArrayToString(bytes); // restore string
        flag = double.TryParse(str, out double addend);
        sum += flag ? addend : 0;
        Console.WriteLine(sum); //write

        if(!flag)
            break;
    }
}

return 0;
로그인 후 복사

위 내용은 go와 C# 콘솔 애플리케이션 간에 장기 파이프 연결을 설정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

C++ 오픈 소스 라이브러리란 무엇입니까? C++ 오픈 소스 라이브러리란 무엇입니까? Apr 22, 2024 pm 05:48 PM

C++는 다음 기능을 다루는 풍부한 오픈 소스 라이브러리 세트를 제공합니다. 데이터 구조 및 알고리즘(표준 템플릿 라이브러리) 멀티스레딩, 정규식(Boost) 선형 대수(Eigen) 그래픽 사용자 인터페이스(Qt) 컴퓨터 비전(OpenCV) 기계 학습 (TensorFlow) 암호화 (OpenSSL) 데이터 압축 (zlib) 네트워크 프로그래밍 (libcurl) 데이터베이스 관리 (sqlite3)

Debian에서의 Qt 설치 및 Debian 10의 Qt 설치에 대한 자세한 설명 Debian에서의 Qt 설치 및 Debian 10의 Qt 설치에 대한 자세한 설명 Feb 12, 2024 pm 06:40 PM

Qt는 크로스 플랫폼 C++ 애플리케이션 개발 프레임워크로, 데비안 시스템에서 패키지 관리자를 통해 Qt를 설치할 수 있습니다. 이 기사에서는 데비안 시스템에서 Qt를 설치하는 방법을 자세히 소개합니다. Debian10에 Qt를 설치하는 구체적인 단계. Debian 시스템에 Qt가 설치되어 있습니다. apt 패키지 관리자를 통해 Qt를 설치할 수 있습니다. 다음은 Debian 시스템에 Qt를 설치하는 단계입니다. 1. 터미널을 열고 패키지 목록을 업데이트합니다. ```shellsudoapt-getupdate `` `2. Qt 라이브러리 및 QtCreator 통합 개발 환경 설치: sudoapt-ge

Go 언어의 미래 개발 동향을 살펴보세요 Go 언어의 미래 개발 동향을 살펴보세요 Mar 24, 2024 pm 01:42 PM

제목: Go 언어의 미래 개발 동향 탐구 인터넷 기술의 급속한 발전과 함께 프로그래밍 언어도 끊임없이 진화하고 발전하고 있습니다. 그중 Go 언어(Golang)는 구글이 개발한 오픈소스 프로그래밍 언어로 단순성, 효율성, 동시성 기능으로 많은 사랑을 받고 있습니다. 점점 더 많은 기업과 개발자가 애플리케이션 구축에 Go 언어를 채택하기 시작하면서 Go 언어의 향후 개발 동향이 많은 주목을 받고 있습니다. 1. Go 언어의 특징과 장점 Go 언어는 가비지 수집 메커니즘을 갖춘 정적인 유형의 프로그래밍 언어이며,

C 언어의 특징과 장점: C 언어가 가장 인기 있는 프로그래밍 언어 중 하나인 이유는 무엇입니까? C 언어의 특징과 장점: C 언어가 가장 인기 있는 프로그래밍 언어 중 하나인 이유는 무엇입니까? Feb 23, 2024 am 08:39 AM

C 언어의 특징과 장점: C 언어가 가장 인기 있는 프로그래밍 언어 중 하나인 이유는 무엇입니까? 범용 고급 프로그래밍 언어인 C 언어는 많은 고유한 기능과 장점을 갖고 있으며, 이것이 바로 가장 널리 사용되는 프로그래밍 언어 중 하나가 된 이유입니다. 이 기사에서는 C 언어의 특징과 장점을 살펴보고 다양한 분야에서 폭넓게 적용할 수 있는 방법을 살펴보겠습니다. 우선 C 언어는 간결한 구문과 명확한 구조를 가지고 있습니다. 다른 프로그래밍 언어에 비해 C 언어의 구문은 비교적 간단하고 이해하고 배우기 쉽습니다. 프로그래머가 자연어의 특성을 활용하여

pycharm 프로젝트의 exe를 APK로 패키징하는 방법 pycharm 프로젝트의 exe를 APK로 패키징하는 방법 Apr 03, 2024 pm 07:24 PM

PyCharm은 Python 프로젝트를 APK로 직접 패키징할 수 없습니다. PyCharm은 Python 개발에 중점을 두고 있으며 APK는 Android 기기에서 앱을 실행하는 데 사용됩니다. Python 프로젝트를 APK로 패키징하려면 추가 도구와 단계가 필요합니다.

유니앱 개발과 네이티브 개발 중 어느 것이 더 낫나요? 유니앱 개발과 네이티브 개발 중 어느 것이 더 낫나요? Apr 06, 2024 am 05:06 AM

UniApp과 네이티브 개발 중에서 선택할 때는 개발 비용, 성능, 사용자 경험 및 유연성을 고려해야 합니다. UniApp의 장점은 크로스 플랫폼 개발, 빠른 반복, 쉬운 학습 및 내장 플러그인이며, 네이티브 개발은 성능, 안정성, 네이티브 경험 및 확장성이 뛰어납니다. 구체적인 프로젝트 요구사항에 따라 장단점을 따져보세요. UniApp은 초보자에게 적합하고, 네이티브 개발은 고성능과 원활한 경험을 추구하는 복잡한 애플리케이션에 적합합니다.

Java 변수 이름을 지정할 때 중국어를 사용할 때의 장점과 단점 Java 변수 이름을 지정할 때 중국어를 사용할 때의 장점과 단점 Feb 18, 2024 am 10:14 AM

Java 변수 이름 지정에 중국어 사용의 장점과 단점 Java 프로그래밍에서는 일반적으로 영어를 사용하여 변수, 메서드, 클래스와 같은 식별자 이름을 지정합니다. 그러나 때로는 식별자의 일부로 중국어를 사용하는 것도 고려할 수 있습니다. 이 기사에서는 중국어로 명명된 Java 변수를 사용할 때의 장점과 단점을 살펴보고 몇 가지 구체적인 코드 예제를 제공합니다. 장점 1: 코드 가독성 향상. 중국어로 명명된 Java 변수를 사용하면 코드를 더 쉽게 이해하고 읽을 수 있습니다. 결국 우리 뇌는 영어보다 중국어를 더 자연스럽고 유창하게 이해하고 인식합니다. 영어가 아닌 경우

개발 효율성 측면에서 Go 언어와 Java 비교: 장단점 비교 개발 효율성 측면에서 Go 언어와 Java 비교: 장단점 비교 Jan 31, 2024 pm 09:16 PM

개발 효율성 측면에서 Go 언어와 Java의 차이점: 장점과 단점 개요 Go 언어와 Java는 모두 널리 사용되는 프로그래밍 언어이며 고유한 장점과 단점을 가지고 있습니다. 개발 효율성 측면에서도 Go 언어와 Java는 성능이 다릅니다. Go 언어의 장점은 간단하고 배우기 쉽습니다. Go 언어의 구문은 간단하고 이해하기 쉽고 학습 곡선이 낮습니다. 따라서 Go 언어는 초보 프로그래머나 프로젝트를 빠르게 개발해야 하는 프로그래머에게 이상적입니다. 빠른 컴파일 속도: Go 언어의 컴파일 속도는 매우 빠르므로 Go 언어는 빠른 반복에 매우 적합합니다.

See all articles