#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 ...
? Исследование? Вам сказали использовать поток.