C#服务器,Android Java客户端-连接问题

问题描述 投票:0回答:1

我目前正在一个大学项目中,我们将数据从Arduino发送到C#服务器(已经工作),然后使用TCP将信息传递给运行有Java客户端的Android应用。不幸的是,后者还没有完全起作用。我已经可以在客户端和服务器之间建立连接,并且可以从虚拟电话(Android Studio)向服务器发送消息,但是反之则不行。我对Java完全没有经验,因此非常感谢所有帮助!

我已附上以下代码:

C#服务器:

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading.Tasks;
using System.Collections.Generic;

public class SocketServer
{
    public static void Main()
    {
        Parallel.Invoke
        (
            () => Arduino(),
            () => Android()
        );
    }


    public static void Arduino()
    {
        //Removed since unnecessary for question
    }

    public static void Android()
    {
        StreamReader streamReader_App;
        NetworkStream networkStream_App;

        TcpListener tcpListener_App = new TcpListener(1010);
        tcpListener_App.Start();

        Console.WriteLine("The Server has started on port 1010");

        int msg;

        while (true)
        {
            Socket serverSocket_App = tcpListener_App.AcceptSocket();

            try
            {
                Console.WriteLine("App-Client connected");
                networkStream_App = new NetworkStream(serverSocket_App);

                streamReader_App = new StreamReader(networkStream_App);
                msg = 0;

                while (msg == 0)
                {
                    var line_App = streamReader_App.ReadLine();
                    if (line_App == "CoordRequest")
                    {
                        System.Threading.Thread.Sleep(3000);
                        Console.WriteLine(line_App);
                        //Send coordinates to App
                        string message = "Test";
                        byte[] bytes = Encoding.ASCII.GetBytes(message+"\r\n");
                        networkStream_App.Write(bytes, 0, bytes.Length);
                        bytes = new byte[1024];
                        msg = 1;
                    }
                }

                networkStream_App.Close();
                serverSocket_App.Close();
            }

            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
    }
}

Java客户端(在Android上为启动客户端并接收消息:MainActivity.java

package com.example.tcpclient;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {

    EditText e1;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        e1 = (EditText)findViewById(R.id.editText);

        Thread myThread = new Thread(new MyServerThread());
        myThread.start();
    }

    class MyServerThread implements Runnable
    {
        Socket s;
        ServerSocket ss;
        InputStreamReader isr;
        BufferedReader bufferedReader;
        Handler h = new Handler();

        String message;

        @Override
        public void run()
        {
            try
            {
                ss = new ServerSocket(1010);
                while(true)
                {
                    s = ss.accept();
                    isr = new InputStreamReader(s.getInputStream());
                    bufferedReader = new BufferedReader(isr);
                    message = bufferedReader.readLine();

                    h.post(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            }catch(IOException e)
            {
            e.printStackTrace();
            }
        }
    }

    public void send(View v)
    {
        MessageSend messageSender = new MessageSend();
        messageSender.execute(e1.getText().toString());
    }
}

Java客户端(在Android上发送消息:MessageSend.java

package com.example.tcpclient;

import android.os.AsyncTask;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;

public class MessageSend extends AsyncTask<String,Void,Void>
{
    Socket s;
    DataOutputStream dos;
    PrintWriter pw;

    @Override
    protected Void doInBackground(String... voids) {

        String message = voids[0];
        try
        {
            s = new Socket("192.168.1.10",1010);
            pw = new PrintWriter(s.getOutputStream());
            pw.write(message);
            pw.flush();
            pw.close();
            s.close();

        }catch(IOException e)
    {
        e.printStackTrace();
    }



        return null;
    }
}

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.tcpclient">
    <uses-permission android:name = "android.permission.INTERNET"></uses-permission>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
java c# android tcp
1个回答
0
投票

您正在使用套接字来收听Tcp Client,Socket serverSocket_App = tcpListener_App.AcceptSocket();

© www.soinside.com 2019 - 2024. All rights reserved.