Я пытаюсь отправить одну строку с android на компьютер и после небольшого исследования на этом сайте и других, которые я узнал о сокетах и как их использовать. Я написал программу сервера, которая может получать переданные ей строки. Ниже приведен код.Клиентский сокет на android
//static ServerSocket variable
private static ServerSocket server;
//socket server port on which it will listen
private static int port = 9021;
public static void main(String [] args) throws IOException, ClassNotFoundException{
server = new ServerSocket(port);
while(true){
System.out.println("Waiting for client request." + InetAddress.getLocalHost());
Socket socket = server.accept();
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
String message = (String)ois.readObject();
System.out.println("Message received: " + message);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject("Hi Client: " + message);
ois.close();
oos.close();
socket.close();
if(message.equalsIgnoreCase("exit")){
break;
}
}
System.out.println("Shutting down serve");
server.close();
}
Я тестировал это с помощью клиентской программы pc, которая отправляет строку и подтверждает, что этот скрипт сервера работает. Я пытаюсь реализовать ту же концепцию в android, но сталкиваюсь с множеством проблем, в основном из-за того, что учебники онлайн для этой задачи очень устарели (2-3 года), поэтому ничего не работает, как ожидалось. Может ли кто-нибудь сказать мне, как написать очень простое приложение для Android, в котором одна строка отправляется через сокет?
Из-за того, что я вижу в лог-катке, устаревшие учебные пособия в Интернете не работают, потому что в последних версиях андроид, по-видимому, ввел в себя очень агрессивный диспетчер процессов, который контролирует поведение потоков и если есть какие-либо повторяющиеся действия потока, он закрывает его без предупреждения.
Редактировать: В соответствии с решением я реализовал асинтез. Но теперь сервер не получает и говорит, что адрес уже используется. Я думаю, что это из-за адреса сокета в моем коде Android. Пожалуйста помоги!
public class MainActivity extends Activity {
private Button button;
private EditText message;
private TextView finalResult;
//InetAddress host;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
message = (EditText) findViewById(R.id.et_time);
button = (Button) findViewById(R.id.btn_do_it);
finalResult = (TextView) findViewById(R.id.tv_result);
/*
try {
host = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
AsyncTaskRunner runner = new AsyncTaskRunner();
String msg = message.getText().toString();
runner.execute(msg);
}
});
}
private class AsyncTaskRunner extends AsyncTask<String, String, String> {
Socket socket = null;
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
int clientport = 8080;
String resp;
@Override
protected String doInBackground(String... params) {
publishProgress("Sending...");
String msg = params[0];
for(int i=0;i<=5;i++){
//establish socket connection to server
try {
socket = new Socket("100.69.73.16",clientport);
//write to socket using Objectouputstream
oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(msg+i);
oos.close();
socket.close();
Thread.sleep(100);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
resp = "Message has been sent";
return resp;
}
@Override
protected void onPostExecute(String result) {
finalResult.setText(result);
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(String... values) {
finalResult.setText(values[0]);
}
}
}
Во-первых, вы должны использовать Asynctask, в которой вы делаете подключение к серверу. – Dien
Как вы подключились к ПК? Через Wi-Fi? Или по сети? –
Благодарим вас за предложение асинхронности. Я написал приложение, используя это, и ему удалось отправить сообщение. Но теперь мой сервер не получает его. Он вызывает ошибку и говорит - адрес уже используется: JVM_bind. Я добавлю свой код приложения для Android в исходное сообщение, чтобы вы могли посмотреть. Aiyaz, это более Wi-Fi. Спасибо за интерес! – Zod