[英]Android Java Socket Socket TCPIP open connection
我需要通过TCPIP连接到服务器。 我发现了如何执行此操作,但是示例并未建立永久连接,它只是连接发送数据并删除了连接。 我需要保持连接打开状态来回传递几个软件包。
例如,我习惯于请求连接,然后有一个过程来侦听传入的数据。 像这样:
有什么我可以阅读的或更好的示例代码吗?
从现在开始(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:您可以放心地删除Log调用和大多数检查以及3个最终替代项(我将其全部保留在那里,因为它使在某些情况下更容易建立)。
在froyo,姜饼,ics和jb上进行了测试。
我制作了一个具有不同用途的类似应用程序,只是服务器端没有监听,只有发送。 但是,它确实处于循环打开状态,您可以对其进行修改,以在收到特定消息后使用while循环中的strstr命令关闭该循环和连接。 请参阅本主题: 垃圾邮件,该数据通过WiFi TCP连接从台式机传输到Android以获取代码,并更改行:
n = write(newsockfd, string, sizeof(string));
至
n = write(newsockfd, string, strlen(string));
为了解决我遇到的问题。
也许您还是应该选择更高级别的库,例如“ Apache MINA”或“ Netty”?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.