Как заставить клиента на Android слушать сервер на C#?
у меня есть клиент на Android и сервер на c#. Клиент отправляет сообщения на сервер и все нормально. Но мне нужен сервер для отправки по запросу списка папок и файлов в указанном каталоге и не знаю, как это сделать, потому что клиент не получает никаких сообщений от сервера. Клиентская часть кода, предназначенная для прослушивания, не работает, приложение просто застревает, пока я не закрою серверное приложение, затем оно снова работает, но по-прежнему ничего не читает. Спасибо заранее
клиент:
package com.app.client.app;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import android.util.Log;
public class my_activity extends Activity {
private TextView txt;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button b = (Button)findViewById(R.id.button1);
txt = (TextView)findViewById(R.id.textView1);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
connectSocket("Hello");
}
});
}
private void connectSocket(String a){
try {
InetAddress serverAddr = InetAddress.getByName("192.168.1.2");
Log.d("TCP", "C: Connecting...");
Socket socket = new Socket(serverAddr, 4444);
message = "1";
PrintWriter out = null;
BufferedReader in = null;
try {
Log.d("TCP", "C: Sending: '" + message + "'");
out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.println(message);
while ((in.readLine()) != null) {
txt.append(in.readLine());
}
Log.d("TCP", "C: Sent.");
Log.d("TCP", "C: Done.");
} catch(Exception e) {
Log.e("TCP", "S: Error", e);
} finally {
socket.close();
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
Log.e("TCP", "C: UnknownHostException", e);
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e("TCP", "C: IOException", e);
e.printStackTrace();
}
}
}
сервер:
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
public class serv {
public static void Main() {
try {
IPAddress ipAd = IPAddress.Parse("192.168.1.2");
// use local m/c IP address, and
// use the same in the client
/* Initializes the Listener */
TcpListener myList=new TcpListener(ipAd,4444);
/* Start Listeneting at the specified port */
myList.Start();
Console.WriteLine("The server is running at port 4444...");
Console.WriteLine("The local End point is :" +
myList.LocalEndpoint );
Console.WriteLine("Waiting for a connection.....");
m:
Socket s=myList.AcceptSocket();
Console.WriteLine("Connection accepted from " + s.RemoteEndPoint);
byte[] b=new byte[100];
int k=s.Receive(b);
char cc = ' ';
string test = null;
Console.WriteLine("Recieved...");
for (int i = 0; i < k-1; i++)
{
Console.Write(Convert.ToChar(b[i]));
cc = Convert.ToChar(b[i]);
test += cc.ToString();
}
switch (test)
{
case "1":
break;
}
ASCIIEncoding asen=new ASCIIEncoding();
s.Send(asen.GetBytes("The string was recieved by the server."));
Console.WriteLine("nSent Acknowledgement");
/* clean up */
goto m;
s.Close();
myList.Stop();
Console.ReadLine();
}
catch (Exception e) {
Console.WriteLine("Error..... " + e.StackTrace);
}
}
}
3 ответов
хорошо, я нашел решение вашей проблемы.
на вашем сервере c#, куда вы отправляете текст:
ASCIIEncoding asen = new ASCIIEncoding();
s.Send(asen.GetBytes("The string was recieved by the server."));
s.Close();
Не забудьте закрыть сокет здесь после отправки данных. вот почему ваше приложение будет висеть. Он ждал большего ввода от сервера
кроме того, измените это на Java, где вы получаете
String text = "";
String finalText = "";
while ((text = in.readLine()) != null) {
finalText += text;
}
txt.setText(finalText);
обратите внимание, как вы делаете 2 readInputs в этом цикле. Оператор while делает это.. и текст один.. так ты ... по существу, пытаясь прочитать 2 строки в течение одного цикла. Изменение того, что я опубликовал выше, исправит это
чтобы избежать исключения NetworkOnMainThreadException, необходимо выполнить код связи в новом потоке.
в клиенте Android:
@Override
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
connectSocket("Hello");
}
}).start();
}
Спасибо за пример кода!
просто для информации:
необходимо установить следующее разрешение:
<uses-permission android:name="android.permission.INTERNET" />