我需要通过TCPIP连接到服务器。我发现了如何做到这一点,但是示例没有建立永久连接,只是连接发送数据并丢弃连接。我需要打开连接来传递几个包。
例如,我习惯于请求连接,然后有一个进程来侦听传入的数据。像这样:
有什么我可以阅读这个或更好的示例代码吗?
答案 0 :(得分:4)
从现在起(ICS +),要建立网络连接,您需要使用AsyncTask(或处理程序),除非您愿意删除限制(不可取!)。默认情况下,网络连接受主活动线程的限制。
这个AsyncTask可以解决这个问题(另一方面我有一个c ++套接字服务器)。在这种情况下,我打开套接字,发送我从主活动收到的字符串,接收答案,发送另一条消息(这次“你好”)并在关闭连接之前收到最后的消息。
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import android.os.AsyncTask;
import android.util.Log;
public class SocketConnect extends AsyncTask <String, Integer, String> {
String TAG = "TGsocket";
@Override
protected String doInBackground(String... params) {
String url = params[0];
String textSend = params[1];
Log.i(TAG, "textsend = |" + textSend + "|");
Socket socket = null;
DataOutputStream dataOutputStream = null;
DataInputStream dataInputStream = null;
try {
socket = new Socket(url, 9090);
dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataInputStream = new DataInputStream(socket.getInputStream());
Log.i(TAG,"socket OK");
dataOutputStream.writeUTF(textSend);
String textInNow = dataInputStream.readLine();
Log.w(TAG, "says Server = " + textInNow);
dataOutputStream.writeUTF("hello there");
textInNow = dataInputStream.readLine();
Log.w(TAG, "says 2ndTime Server = " + textInNow);
} catch (UnknownHostException e) {
Log.e(TAG, "at thread unknownHost " + e.getMessage());
e.printStackTrace();
} catch (IOException e) {
Log.e(TAG, "at thread IO " + e.getMessage());
e.printStackTrace();
}
finally{
Log.i(TAG, "finally");
if (dataOutputStream != null){
try {
dataOutputStream.close();
} catch (IOException e) {
Log.e(TAG, "at thread dataoutput IO " + e.getMessage());
e.printStackTrace();
}
}
if (dataInputStream != null){
try {
dataInputStream.close();
} catch (IOException e) {
Log.e(TAG, "at thread datainput IO " + e.getMessage());
e.printStackTrace();
}
}
if (socket != null){
try {
Log.i(TAG, "socket closed");
socket.close();
} catch (IOException e) {
Log.e(TAG, "at thread finally IO " + e.getMessage());
e.printStackTrace();
}
}
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
//displayProgressBar("Downloading...");
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
//updateProgressBar(values[0]);
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
}
使用(在try catch中)调用:
SocketConnect("100.100.100.100","some string");
其中“100.100.100.100”是您服务器的IP。
注意1:不要忘记设置互联网使用权限(在清单文件中) 注意2:您可以安全地剥离日志调用和大多数检查,以及3个最终覆盖(我只是将其全部留在那里,因为它使得在某些情况下更容易构建)。
在froyo,gingerbread,ics和jb上测试。
答案 1 :(得分:0)
我用不同的用法制作了一个类似的应用程序,只是在服务器端没有涉及监听,只发送。但是,它确实在循环中保持打开状态,您可以在接收到特定消息时将其修改为在while循环中使用strstr命令关闭循环和连接。请参阅此主题:Garbage data transmitted in WiFi TCP connection from desktop to Android代码,并更改行:
n = write(newsockfd, string, sizeof(string));
到
n = write(newsockfd, string, strlen(string));
为了解决我遇到的问题。
答案 2 :(得分:0)
也许您应该选择更高级别的库,例如“Apache MINA”或“Netty”?