0

TCPServerを作成するherculesプログラム my_form

メソッドに問題がありますStreamReader.ReadLine()。C#プログラムを作成しましたが、TCPクライアント側のみです。Herculesプログラムを使用してTCPServerを作成しています。ポート番号を入力して接続しました。次に、プログラムを実行し、[接続]ボタンをクリックしました。その後、TCPServerと接続しました。

TCPClientからHercules(TCPServer)にデータを送信することに問題はありません。写真のように、「Entered to Send」EditTextに文字列を入力し、ボタンをクリックして文字列を送信しました(受信データ部分Sendからの送信データを確認できます)。

ここまでは問題ありません。一部送信後、hercules(TCPServer)からTCPClientにデータを送信できません。データを送信するために、送信部分にデータを書き込ん でSendボタンをクリックしました。その後、次のデータを表示するには、Showボタンをクリックする必要があります.....問題はここにあります。ReadStreamバッファからデータを読み取ることができません。プログラムをデバッグしたところ、次のような問題のある部分が見つかりました。

private void btnShow_Click(object sender, EventArgs e)
    {
        try
        {
            string gelen;
            gelen = read_stream.ReadLine();
            txtReceive.Text = gelen;
            MessageBox.Show(gelen, "you have message from server");
        }
        catch
        {
            MessageBox.Show("message could not taken !!!");
        }
    }

パーツの内側にtry線があります。

gelen = read_stream.ReadLine();

問題があります。ReadLine()がバッファからデータを読み取っていません。ここに興味深い部分があります。データを送信してShowボタンをクリックするとプログラムがフリーズしますが、ボタンをクリックして接続を閉じると、hercules.pngデータを取得してReceived: EditTextに入れます。Closeread_stream.ReadLine();

  • TCPServerから切断した後、なぜデータを取得するのですか?
  • \r\n キャラクターが問題なのかもしれませんか?
  • 次のキャラクターを待っていると思いました。だから、私が切断したとき、それは3つがもはやキャラクターではないことを認識しているので機能します。私の質問はそれです:

read_stream.ReadLine();を使用するにはどうすればよいですか。切断せずにデータを送信するには?

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    using System.Net;
    using System.Net.Sockets;

    using System.Threading;
    using System.Net.Sockets;
    using System.IO;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;

    namespace CSharpVeriDenemesi
    {
    public partial class Form1 : Form
    {
        //Burda server da tanımladıklarımızdan farklı olarak TcpClient sınıfı ile serverdan gelen bilgileri alıyoruz
    public TcpClient Client;
    private NetworkStream network_stream;
    private StreamReader read_stream;
    private StreamWriter write_stream;

    private string local_host = "localhost";
    private int port_number = 8001;
    public TcpListener listener;
    // IPAddress localAddress = IPAddress.Parse("127.0.0.1");

    public Form1()//form oluşunca otomatik oluşturulan fonksiyon
    {
        InitializeComponent();
    }

    private void btnConnect_Click(object sender, EventArgs e)//CONNECT
    {
        try
        {
            Client = new TcpClient(local_host, port_number);//İlk parametre bilgisayar adı ikincisi ise port numarasıdır.
            MessageBox.Show("Baglandi");
        }
        catch
        {
            MessageBox.Show("Baglanamadi");
            return;
        }
        network_stream = Client.GetStream();
        read_stream = new StreamReader(network_stream);
        write_stream = new StreamWriter(network_stream);

    }

    private void btnDisconnect_Click(object sender, EventArgs e)//DISCONNECT
    {
        txtSend.Text = "Disconnect clicked";
        try
        {
            write_stream.Close();
            read_stream.Close();
            network_stream.Close();
        }
        catch
        {
            MessageBox.Show("Düzgün kapatilamiyor !!!" );
        }
    }

    private void btnReset_Click(object sender, EventArgs e)//send ve receive text.box'larını resetliyor.
    {
        txtSend.Text = "";
        txtReceive.Text = "";     
        MessageBox.Show("Reset'e basıldı");          
    }

    private void Form1_Load(object sender, EventArgs e)//sayfa ilk açıldığında olcaklar için açılan dosya
    {

    }

    private void btnSend_Click(object sender, EventArgs e)//veriyi server'a gönderiyor
    {

        try
        {
            write_stream.WriteLine(txtSend.Text);
            write_stream.Flush();  //veriyi gönderiyor
            MessageBox.Show("Veri gönderildi");
        }
        catch {
            MessageBox.Show("Veri gönderilmedi !!!");          
        }            
    }

    private void btnShow_Click(object sender, EventArgs e)
    {
        try
        {
            string gelen;
            gelen = read_stream.ReadLine();
            txtReceive.Text = gelen;
            MessageBox.Show(gelen, "you have message from server");
        }
        catch
         {
            MessageBox.Show("message could not taken !!!");
        }
    }
    }
    }

これが私のmain.csです。追加するのを忘れました。あなたはそれを書いて私のプロジェクトを試すことができます...注:これは移植可能なヘラクレスへのリンクです、あなたはそれを簡単に実行することができます[ http://www.hw-group.com/products/hercules/index_en.html] 3

4

1 に答える 1

3

サーバー側で使用しない場合は、ReadLine() 関数を使用するときにクライアント側でStream.WriteLine("something..");常に待機する必要があります。End of line char (\r or \n or \r\n)

したがって、ReadLine() は、接続が閉じられたときにのみ完了します => 問題。

あなたのコード:

        write_stream.WriteLine(txtSend.Text);
        write_stream.Flush();  //veriyi gönderiyor

クライアント側でサーバーにフィードバックするために使用され、サーバーがデータを送信することには意味がありません。

char ごとに読み取ることでクライアント側を試すか、特定の長さの BUFFER で Read() を使用します。

于 2012-10-31T09:10:34.870 に答える