3

TCP を使用して ac# クライアントから Delphi サーバーにテキスト行を送信しようとしています。どちらもローカルホストで実行するだけです。私は、クライアントが適切なときにテキスト行を送信し、サーバーが適切なときに一度に 1 行ずつ受信ストリームからそれらを読み込んで処理できるようにしたいと考えています。

以下のコードは、「テキスト 1 の一部の行」を表示する Delphi メモでこれを 1 回実現します。その後、C# が戻り、接続が強制的に閉じられたことを示す例外が発生します。

クライアント接続を閉じて、テキスト行が送信されるたびに新しい接続を再確立すると、目的の効果が得られます。しかし、これは非常に遅く、私の意図した用途には適していません。

私は TCP に不慣れで、自分が何をしているのかほとんどわかりません! 望ましい結果を達成するための助けをいただければ幸いです。

Delphi サーバー コードは....

procedure TForm1.FormCreate(Sender: TObject);
begin

  Memo1.Lines.Clear;

  //Server initialization
  TcpServer1 := TTcpServer.Create(Self);
  TcpServer1.OnAccept := TcpServer1Accept;
  TcpServer1.LocalPort := IntToStr(DEFAULT_PORT);
  TcpServer1.Active := true;


end; //TForm1.FormCreate procedure ends


procedure TForm1.TcpServer1Accept(Sender: TObject;
  ClientSocket: TCustomIpClient);
var
somestring : string;
begin

    somestring := ClientSocket.Receiveln('#$D#$A');
    Memo1.Lines.Add(somestring);

end; //TForm1.TcpServer1Accept ends

c#コードは…………

public static void Main (string[] args)
{

    bool connectionEstablished = false;
    int messageNum = 1;
    TcpClient theclient = new TcpClient();

    //first try establish a successful connection before proceeding
    Console.WriteLine("Waiting for server......");
    while (connectionEstablished == false) {

        connectionEstablished = true;

        try {

            Int32 port = 2501;
            string server = "127.0.0.1"; //the ip of localhost

            theclient = new TcpClient(server, port);

        } catch {

            Console.WriteLine("Could not find AI server");
            connectionEstablished = false;  
        }


    } //while (connectionEstablished == false) ends

    Console.WriteLine("Connected to server");

    ////////////////////////////////////////
    while (true) {

      try 
      {

        string message = "some line of text " + messageNum.ToString() + "#$D#$A";   

        // Translate the passed message into ASCII and store it as a Byte array.
        Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);         

        NetworkStream stream = theclient.GetStream();

        stream.Write(data, 0, data.Length); //working

        messageNum = messageNum + 1;

      }
      catch (ArgumentNullException e) 
      {
        Console.WriteLine("ArgumentNullException: {0}", e);
        Console.WriteLine("\n Press Enter to continue...");
        Console.Read();                             

      } 
      catch (SocketException e) 
      {
        Console.WriteLine("SocketException: {0}", e);
        Console.WriteLine("\n Press Enter to continue...");
        Console.Read();         

      }


        System.Threading.Thread.Sleep(2500);

    } //while (true) ends
    ////////////////////////////////////////////////


}



    }
4

2 に答える 2

4

TcpClient のインスタンスを作成したら、実際にConnect.

IPAddress a = IPAddress.Loopback; も使用できます。解析する必要がないように、ループバック アダプター用です。

try 
{
    Int32 port = 2501;
    string server = "127.0.0.1"; //the ip of localhost
    theclient = new TcpClient();

    theclient.Connect(server,port);
}
于 2013-09-09T07:38:47.100 に答える
0

Delphi でのソケット クラスの正確な動作はわかりませんが、OnAccept手順TForm1.TcpServer1Acceptが終了するとサーバーが接続を閉じるように見えます。そのため、おそらく終了基準を使用して、ループもある必要があります。

procedure TForm1.TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient);
var
  somestring : string;
begin
  do
    begin
      somestring := ClientSocket.Receiveln('#$D#$A');
      Memo1.Lines.Add(somestring);
    end;
  while(somestring.length > 0);
end; //TForm1.TcpServer1Accept ends

私は長い間 Delphi/Pascal を使用していないため、これは有効な Delphi コードではありませんが、理解できると思います...

于 2013-09-10T06:46:37.143 に答える