メソッドに問題があります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に入れます。Close
read_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