0

C#アプリケーションをJavaベースのローカルサービスに接続しようとしています。私はJavaコードとサービスの詳細にアクセスできません。私が知っている唯一のことは、指定されたポートを介してソケットを介して通信することです。

問題は、接続できてもデータを送受信できないことです。私のC#クライアントコードは次のとおりです。

=====================

IPHostEntry ipAddress = Dns.GetHostEntry("127.0.0.1");
IPEndPoint ip = new IPEndPoint(IPAddress.Parse(ipAddress.AddressList[0].ToString()), 8888);
socket = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ip);

Encoding ASCII = Encoding.ASCII;
Byte[] byteGetString = ASCII.GetBytes("Service_Command_Message");
Byte[] receivedBytes = new Byte[256];
string l_Response = string.Empty;

socket.Send(byteGetString, byteGetString.Length, SocketFlags.None);

//debugger gets lost at this line. I also tried stream.read    
Int32 bytes = socket.Receive(receivedBytes, receivedBytes.Length, SocketFlags.None);
l_Response += ASCII.GetString(receivedBytes, 0, bytes);
while (bytes > 0)
{
    bytes = socket.Receive(receivedBytes, receivedBytes.Length, SocketFlags.None);
    l_Response = l_Response + ASCII.GetString(receivedBytes, 0, bytes);
}
socket.Close();

=====================

接続性を示すポートキャプチャツールを使用してみましたが、送信データの長さが0であることが示されています。

助けてくれてありがとう。

=======更新(TcpClinetを使用して送信)==========

client = new TcpClient("127.0.0.1", 8888);
stream = client.GetStream();

Byte[] data = System.Text.Encoding.ASCII.GetBytes("Service_Command_Message");

StreamWriter sw = new StreamWriter(stream);

sw.WriteLine(p_Message);
sw.Flush();

========================================

Flush()を使用しましたが、アプリケーションを閉じるまでデータは送信されません。

4

1 に答える 1

0

あなたのコードは receive メソッドにヒットするので、send メソッドに問題はないと思います。これを検証するには、out パラメータを確認する必要がありますSocketError

まず第一に、すべてのデータを送受信するソケットに依存することはできません。クライアントが期待していたよりも多くのバイトを送信した可能性は常にあります。Socket.Send メソッドは送信されたバイト数を返すため、それを使用してすべてのバイトを送信したかどうかを判断できます。

Byte[] byteGetString = ASCII.GetBytes("Service_Command_Message");
int count = 0;
while (count < byteGetString.Length ) 
{
    count += socket.Send(
        bytes,
        count, 
        bytes.Length - count, 
        SocketFlags.None)
}

receive メソッドがハングしている理由は、おそらく while ループの状態が原因です。

while (bytes > 0) {
    bytes = socket.Receive(receivedBytes, receivedBytes.Length, SocketFlags.None);
    l_Response = l_Response + ASCII.GetString(receivedBytes, 0, bytes); }

長さゼロのバイトを受信すると、受信が完了したと想定していますが、そうではない場合があります。最後のループでバッファに数バイトを入力すると、ネットワーク ストリームの最後に到達した可能性があります。したがって、while ループ条件を次のように変更する必要があります。

while (bytes == receivedBytes.Length) {
    bytes = socket.Receive(receivedBytes, receivedBytes.Length, SocketFlags.None);
    l_Response = l_Response + ASCII.GetString(receivedBytes, 0, bytes); }

これがすべて失敗した場合、サーバーがバイトを適切に送受信していない可能性があります。

SocketException最後に、接続はいつでも切断される可能性があるため、必ず処理してください。

于 2013-02-27T01:35:25.253 に答える