从套接字连接接收数据流 -- Android
Receive Stream of data from Socket Connection -- Android
我想达到的目标:
第 1 步 >> 打开套接字连接:
Socket socket = new Socket(IPADDRESS, PORTNUMBER);
第 2 步 >> 开始从 Socket 发送和接收数据:
PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
pw.write(dataForSocket + "\n");//Sending Data to socket....
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String translatedMessage = br.readLine();
Log.d(TAG, "Translated Message = "+translatedMessage);//Recieving data from Socket...
步骤 3 >> 从 Socket 接收数据并继续更新 UI...
到目前为止我尝试了什么:
public class AsyncThread extends AsyncTask<String, String, String> {
//High priority UI variables goes below....
private PrintStream out;
private Socket socket;
private BufferedReader in;
//Medium priority NON-UI variables goes below.....
public static final String SERVER_IP = "203.197.xx.xxx";
public static final int SERVER_PORT = 4xxx;
//Least priority variables goes below.....
private final String TAG = "AsyncThread";
@Override
protected String doInBackground(String... params) {
try {
socket = new Socket(SERVER_IP, SERVER_PORT);
String dataForSocket = "A_LARGE_STRING_OF_DATA_SEPERATED_AND_END_WITH_\n";
/////////////---------CODE TO READ & WRITE------------\\\\\\\\\\\\\
// out = new PrintStream(socket.getOutputStream(), true);
// in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//
//
// out.write(dataForSocket.getBytes());
// String message = in.readLine();
// Log.d(TAG, "Message from Socket == "+message);
PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// Send first message - Message is being correctly received
pw.write(dataForSocket + "\n");
// pw.write(dataForSocket);
// Send off the data
String translatedMessage = br.readLine();
Log.d(TAG, "Translated Message = "+translatedMessage);//In every case this comes null....
// pw.flush();
// pw.close();
}
catch(Exception e){
e.printStackTrace();
}
return null;
}//doInBackground
}//async task class closes here.....
但是 BufferedReader 始终为空。所以,我不知道哪里出了问题。
因此作为结论:
如果有人能给我确切的步骤并指导我完成这个场景,那么我将非常感谢你。
P.S。 : 直到现在我什至无法连接到套接字:-(
我在设备上尝试了 运行,在模拟器上尝试了 运行,在 Genymotion 上尝试了 运行 没有任何效果。
此外,如果有人可以为我提供某种在线测试器,请提供同样的东西。
最终得到的解决方案为:
public class AsyncThread extends AsyncTask<String, String, String>
{
//High priority UI variables goes below....
private PrintStream out;
private Socket socket;
private BufferedReader in;
//Medium priority NON-UI variables goes below.....
public static final String SERVER_IP = "203.xxx.xx.xxx";
public static final int SERVER_PORT = 4xxx;
//Least priority variables goes below.....
private final String TAG = "AsyncThread";
@Override
protected String doInBackground(String... params) {
StringBuilder buffer = null;
try {
socket = new Socket(SERVER_IP, SERVER_PORT);
String dataForSocket = "A LARGE STRING TO SERVER";
/////////////---------CODE TO READ & WRITE------------\\\\\\\\\\\\\
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
Log.i("ClientActivity", "Connecting...");
Socket socket = new Socket(serverAddr, SERVER_PORT);
Log.i("ClientActivity", "Sending command.");
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
// where you issue the commands
out.println(dataForSocket);
Log.i("ClientActivity", "Sent.");
final BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
buffer = new StringBuilder();
buffer.append(input.readLine());
Log.d(TAG, "Inside thread : input.readLine() == " + input.readLine());
Log.d(TAG, "Inside thread : buffer == "+buffer);
}//TRY closes here....
catch(Exception e){
e.printStackTrace();
}//catch closes here.....
return buffer.toString().trim();
}//doInBackground CLOSES HERE.....
}//AsyncThread class closes here.....
参考来自:
how to read socket input stream in Android
现在,我只需要使用服务而不是异步,我的问题就解决了。
我想达到的目标:
第 1 步 >> 打开套接字连接:
Socket socket = new Socket(IPADDRESS, PORTNUMBER);
第 2 步 >> 开始从 Socket 发送和接收数据:
PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
pw.write(dataForSocket + "\n");//Sending Data to socket....
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String translatedMessage = br.readLine();
Log.d(TAG, "Translated Message = "+translatedMessage);//Recieving data from Socket...
步骤 3 >> 从 Socket 接收数据并继续更新 UI...
到目前为止我尝试了什么:
public class AsyncThread extends AsyncTask<String, String, String> {
//High priority UI variables goes below....
private PrintStream out;
private Socket socket;
private BufferedReader in;
//Medium priority NON-UI variables goes below.....
public static final String SERVER_IP = "203.197.xx.xxx";
public static final int SERVER_PORT = 4xxx;
//Least priority variables goes below.....
private final String TAG = "AsyncThread";
@Override
protected String doInBackground(String... params) {
try {
socket = new Socket(SERVER_IP, SERVER_PORT);
String dataForSocket = "A_LARGE_STRING_OF_DATA_SEPERATED_AND_END_WITH_\n";
/////////////---------CODE TO READ & WRITE------------\\\\\\\\\\\\\
// out = new PrintStream(socket.getOutputStream(), true);
// in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//
//
// out.write(dataForSocket.getBytes());
// String message = in.readLine();
// Log.d(TAG, "Message from Socket == "+message);
PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// Send first message - Message is being correctly received
pw.write(dataForSocket + "\n");
// pw.write(dataForSocket);
// Send off the data
String translatedMessage = br.readLine();
Log.d(TAG, "Translated Message = "+translatedMessage);//In every case this comes null....
// pw.flush();
// pw.close();
}
catch(Exception e){
e.printStackTrace();
}
return null;
}//doInBackground
}//async task class closes here.....
但是 BufferedReader 始终为空。所以,我不知道哪里出了问题。
因此作为结论:
如果有人能给我确切的步骤并指导我完成这个场景,那么我将非常感谢你。
P.S。 : 直到现在我什至无法连接到套接字:-( 我在设备上尝试了 运行,在模拟器上尝试了 运行,在 Genymotion 上尝试了 运行 没有任何效果。
此外,如果有人可以为我提供某种在线测试器,请提供同样的东西。
最终得到的解决方案为:
public class AsyncThread extends AsyncTask<String, String, String>
{
//High priority UI variables goes below....
private PrintStream out;
private Socket socket;
private BufferedReader in;
//Medium priority NON-UI variables goes below.....
public static final String SERVER_IP = "203.xxx.xx.xxx";
public static final int SERVER_PORT = 4xxx;
//Least priority variables goes below.....
private final String TAG = "AsyncThread";
@Override
protected String doInBackground(String... params) {
StringBuilder buffer = null;
try {
socket = new Socket(SERVER_IP, SERVER_PORT);
String dataForSocket = "A LARGE STRING TO SERVER";
/////////////---------CODE TO READ & WRITE------------\\\\\\\\\\\\\
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
Log.i("ClientActivity", "Connecting...");
Socket socket = new Socket(serverAddr, SERVER_PORT);
Log.i("ClientActivity", "Sending command.");
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
// where you issue the commands
out.println(dataForSocket);
Log.i("ClientActivity", "Sent.");
final BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
buffer = new StringBuilder();
buffer.append(input.readLine());
Log.d(TAG, "Inside thread : input.readLine() == " + input.readLine());
Log.d(TAG, "Inside thread : buffer == "+buffer);
}//TRY closes here....
catch(Exception e){
e.printStackTrace();
}//catch closes here.....
return buffer.toString().trim();
}//doInBackground CLOSES HERE.....
}//AsyncThread class closes here.....
参考来自: how to read socket input stream in Android
现在,我只需要使用服务而不是异步,我的问题就解决了。