Как отправлять данные через сокет в java

#java #python #android #android-studio #sockets

#java #python #Android #android-studio #сокеты

Вопрос:

Я создаю простое приложение для Android для отправки строки на сервер (созданное на python). Я подключаюсь к серверу, используя сокет в отдельном потоке, как показано в коде. Я хочу отправить строку при нажатии кнопки. Это java-код:

 public class MainActivity extends AppCompatActivity {

private Socket socket;
Button btn;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new Thread(new ClientThread()).start();

    btn = (Button) findViewById(R.id.button);
    if (socket != null){
        try {
            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, true);
            writer.println("1");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class ClientThread implements Runnable{
    @Override
    public void run() {
        try {
            socket = new Socket("192.168.0.12", 80);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 

И это мой сервер python

 import socket

host = socket.gethostbyname(socket.gethostname())
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, 80))

print("ip = ", host)

s.listen(1)
print("Listening")

while True:
    conn, addr = s.accept()
    print(addr, " connected to us")
    conn.sendall(bytes("Hello", "utf-8"))
    while True:
        try:
            data = bytes.decode(conn.recv(1024), "utf-8")
            print(data)
        except:
            break
    
    
 

и это вывод сервера

 ip =  192.168.0.12
Listening
('192.168.0.6', 45903)  connected to us
 

Пожалуйста, дайте мне предложение по отправке данных на сервер

Комментарии:

1. I am connecting to server using socket in separate thread Очень хорошо. Но затем, когда вы пишете в сокет, делайте это также в потоке, как теперь у вас есть NetworkOnMainThreadException .

2. Нет, я хочу отправить сообщение при нажатии кнопки, поэтому я не могу сделать это в потоке.

3. Вы должны. Просто запустите новый поток.

4. Большое вам спасибо, это мне очень помогает.

Ответ №1:

     Socket s = new Socket("address",port);
    OutputStream os = s.getOutputStream();
    //do write
    os.close();
    s.shutdownOutput();
 

Когда вы захотите использовать сокет в следующий раз, создайте его заново и подключитесь.

 s.shutdownOutput() 
 

Этот метод записывает данные на сервер, когда вы его вызываете;

Ответ №2:

После стольких исследований я нашел решение своей проблемы. Здесь я делюсь своим кодом

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn = (Button) findViewById(R.id.button);
    btn2 = (Button) findViewById(R.id.button2);

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new Thread(new UPThread()).start();
        }
    });

    btn2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new Thread(new DOWNThread()).start();
        }
    });

}
private PrintWriter output;
private BufferedReader input;
class UPThread implements Runnable{
    @Override
    public void run() {
        try {
            socket = new Socket("192.168.43.235", 80);
            output = new PrintWriter(socket.getOutputStream());
            output.write("UP");
            output.flush();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
class DOWNThread implements Runnable{
    @Override
    public void run() {
        try{
            socket = new Socket("192.168.43.235", 80);
            output = new PrintWriter(socket.getOutputStream());
            output.write("DOWN");
            output.flush();
            socket.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
 

Я запускаю поток при нажатии кнопки, поэтому мне будет легко отправить простую инструкцию в мой проект IOT

Комментарии:

1. After so much research ... ? Исследование? Вам сказали использовать поток.