1

皆さん、こんにちは。私の問題を解決するために時間を割いていただきありがとうございます。プログラミング初心者ですので、的外れな質問でしたらご容赦ください。

C# で記述された Windows フォーム アプリケーションにサーバーがあり、サーバーに接続するクライアントがあります。クライアントはJavaで書かれたAndroid用アプリです。

サーバーに正常に接続してデータ (XML 文字列) を送信できます。私の問題は、私が何をしても、サーバーから「Bla bla bla 文字列が正常に受信されましたありがとう」という形式で応答を得られないことです。サーバーがデータを送信しなかったか、クライアントがデータを受信しなかったために発生しています。コードのさまざまな組み合わせを検索して試しましたが、わかりません。

以下は、サーバーとクライアントのコードです。

クライアント:

public void functionSend (View view)
{
    RadioGroup type = (RadioGroup) findViewById(R.id.radioGroupType);
    TextView ip = (TextView) findViewById(R.id._ip);
    TextView port = (TextView) findViewById(R.id.port);
    TextView event = (TextView) findViewById(R.id.event);
    TextView amount = (TextView) findViewById(R.id.amount);
    TextView comment = (TextView) findViewById(R.id.comment);
    Spinner currency = (Spinner) findViewById(R.id._currencySpinner);
    _ip = ip.getText().toString();
    _event = event.getText().toString();
    _amount = amount.getText().toString();
    _comment = comment.getText().toString();
    if (_comment.equals(""))
    {
        _comment = "empty";
    }
    _currency = currency.getSelectedItem().toString();
    if (port.getText().toString().equals(""))
    {
        _port = 3344; port.setText("3344");
    }
    else
    {
        _port = Integer.parseInt(port.getText().toString());
    }
    rbID = type.getCheckedRadioButtonId();
    if (rbID == R.id.RadioButtonOutgo)
    {
        _type = "outgo";
    }
    else
    {
        _type = "income";
    }

    //------formam XML string--------
    method = "create event";
    key = "123456";
    //formam stringul xml care i-l vom transmite catre server
    clientXMLStream = "<?xml version='1.0' encoding='UTF-8'?>";
    clientXMLStream = clientXMLStream + "\n <Client>";
    clientXMLStream = clientXMLStream +  "\n <ClientKey>" + key + "</ClientKey>";
    clientXMLStream = clientXMLStream +  "\n <Method>" + method + "</Method>";
    clientXMLStream = clientXMLStream +  "\n <ForDay>" + day + "</ForDay>";
    clientXMLStream = clientXMLStream +  "\n <ForMonth>" + (month+1) + "</ForMonth>";
    clientXMLStream = clientXMLStream +  "\n <ForYear>" + year + "</ForYear>";
    clientXMLStream = clientXMLStream +  "\n <Event>" + _event + "</Event>";
    clientXMLStream = clientXMLStream +  "\n <Amount>" + _amount + "</Amount>";
    clientXMLStream = clientXMLStream +  "\n <Type>";
    clientXMLStream = clientXMLStream +  _type + "</Type>";
    clientXMLStream = clientXMLStream +  "\n <Currency>" + _currency + "</Currency>";
    clientXMLStream = clientXMLStream +  "\n <Comment>";
    clientXMLStream = clientXMLStream +  _comment + "</Comment>";
    clientXMLStream = clientXMLStream +  "\n </Client>";
    //--------------------------------
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    DataOutputStream dataOutputStream = null;
    DataInputStream dataInputStream = null;
    try
    {
        Socket socket = null;
        socket = new Socket(_ip, _port);
        //socket.setSoTimeout(2000);
        dataOutputStream = new DataOutputStream(socket.getOutputStream());
        dataInputStream = new DataInputStream(socket.getInputStream());

        dataOutputStream.writeBytes(clientXMLStream.toString());
        event.setText(dataInputStream.readUTF().toString());
        dataOutputStream.flush();
        socket.close();
    }
    catch (Exception e)
    {

    }
}

サーバーコードは次のとおりです。

    void startServer()
{
    Thread listenThread = new Thread(new ThreadStart(listenToMessages));
    listenThread.Start();
}

public void listenToMessages()
{
    tcplistener.Start();
    while (true)
    {
        TcpClient client = tcplistener.AcceptTcpClient();
        Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
        clientThread.Start(client);
    }
}

public void HandleClientComm(object client)
{
    TcpClient tcpClient = (TcpClient)client;
    NetworkStream clientStream = tcpClient.GetStream();

    byte[] message = new byte[4096];
    int bytesRead;

    while (true)
    {
        bytesRead = 0;

        try
        {
            bytesRead = clientStream.Read(message, 0, 4096);
            NetworkStream _clientStream = tcpClient.GetStream();

            ASCIIEncoding _encoder = new ASCIIEncoding();
            byte[] buffer = _encoder.GetBytes("Some Contacts as a string!");
            byte[] lengthBuffer = BitConverter.GetBytes(buffer.Length);
            clientStream.Write(lengthBuffer, 0, lengthBuffer.Length);
            clientStream.Write(buffer, 0, buffer.Length);
            clientStream.Flush();
            tcpClient.Close();

            //clientStream.Close();
        }
        catch
        {
            break;
        }

        if (bytesRead == 0)
        {
            break;
        }
        tcpClient.Close();
        ASCIIEncoding encoder = new ASCIIEncoding();
        processRemoteInputs(encoder.GetString(message, 0, bytesRead));
        //reply

    }
}

void stopServer()
{

}

void processRemoteInputs(String clientXmlString)
{
    XmlDocument remote = new XmlDocument();
    remote.LoadXml(clientXmlString);
    XmlNode method = remote.SelectSingleNode(".//Client/Method");
    if (method.InnerText == "create event")
    {
        XmlNode remoteDay = remote.SelectSingleNode(".//Client/ForDay");
        _neSelDay = Convert.ToInt16(remoteDay.InnerText);
        XmlNode remoteMonth = remote.SelectSingleNode(".//Client/ForMonth");
        _neSelMonth = Convert.ToInt16(remoteMonth.InnerText);
        XmlNode remoteYear = remote.SelectSingleNode(".//Client/ForYear");
        _neSelYear = Convert.ToInt16(remoteYear.InnerText);
        XmlNode remoteEvent = remote.SelectSingleNode(".//Client/Event");
        String _remoteEvent = remoteEvent.InnerText;
        XmlNode remoteAmount = remote.SelectSingleNode(".//Client/Amount");
        String _remoteAmount = remoteAmount.InnerText;
        XmlNode remoteType = remote.SelectSingleNode(".//Client/Type");
        String _remoteType = remoteType.InnerText;
        XmlNode remoteCurrency = remote.SelectSingleNode(".//Client/Currency");
        String _remoteCurrency = remoteCurrency.InnerText;
        XmlNode remoteComment = remote.SelectSingleNode(".//Client/Comment");
        String _remoteComment = remoteComment.InnerText;
        addNewEvent(_remoteEvent, _remoteAmount, _remoteType, _remoteCurrency, _remoteComment);
        setMonthLabel(); clearAllCurrentRows();
        loadXmlIntoDataGridView(); displayMonthDebit(); _monthDataGrid.Rows[Convert.ToInt16(_neSelDay) - 1].Selected = true;
        _monthDataGrid.CurrentCell = _monthDataGrid.Rows[Convert.ToInt16(_neSelDay) - 1].Cells[0]; displayDetailedInfoOnRowSelect();
        displayMonthChart();
    }
}
4

0 に答える 0