Android сокетов, не показывающих данные с сервера - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь отправить данные с сервера python клиенту android, но он не принимает данные с сервера. но это показывает, что он связан с сервером. Я не могу распознать ошибку.

вот мой клиентский код в android java.

package com.example.socketinput;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

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

public class MainActivity extends AppCompatActivity {
    Thread Thread1 = null;
    String SERVER_IP="192.168.1.6";
    int SERVER_PORT=9857;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Thread1 = new Thread(new Thread1());
        Thread1.start();
    }
    private PrintWriter output;
    private BufferedReader input;
    class Thread1 implements Runnable {
        public void run() {
            Socket socket;
            try {
                socket = new Socket(SERVER_IP, SERVER_PORT);
                output = new PrintWriter(socket.getOutputStream());
                input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Log.i("Server", "Connected");
                    }
                });
                new Thread(new Thread2()).start();
            } catch (IOException e) {
                Log.i("Server", "Error in thread 1");
            }
        }
    }
    class Thread2 implements Runnable {
        @Override
        public void run() {
            while (true) {
                try {
                    final String message = input.readLine();
                    if (message != null) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Log.i("Server", message);
                            }
                        });
                    } else {
                        Thread1 = new Thread(new Thread1());
                        Thread1.start();
                        return;
                    }
                } catch (IOException e) {
                    Log.i("Server", "Error in thread 2");
                    e.printStackTrace();
                }
            }
        }
    }
}

вот мой python серверный код.

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import socket


# In[2]:
socket.gethostname()

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 9857))
s.listen(5)


# In[ ]:


while True:
    clientsocket, address = s.accept()
    print(f"connection from {address} has been established!")
    clientsocket.send(bytes("welcome to the server!","utf-8"))

    while True:
        msg=input()
        clientsocket.send(bytes(msg,"utf-8"))

android файл-манифент -:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.socketinput">
    <uses-permission android:name = "android.permission.INTERNET" />
    <uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" />
    <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>

Примечание - Android приложение и python код подключены на одном сервере.

enter image description here

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

final String message = input.readLine(); подождите, пока не получите '\ n'

Вам нужно clientsocket.send(bytes("\n")), если вы хотите остановить отправку.

while True:
    clientsocket, address = s.accept()
    print(f"connection from {address} has been established!")
    clientsocket.send(bytes("welcome to the server!\n","utf-8"))
0 голосов
/ 30 мая 2020

В этом коде:

s.bind (('', 9857))

Вы также должны передать хост.

s.bind (('192.168.1.6', 9857))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...