android 中的仅客户端套接字编程
Client only socket programming in android
我想打开一个 TCP 连接以将数据发送到 android 应用程序中的一个 IP 地址。我发现的每个套接字编程 article/thread 都显示了客户端和服务器端代码(通常是聊天程序)。是否可以只在 android 设备上使用客户端代码 运行ning 并将任意数据发送到例如 google 的 IP 地址?现在我在 class 中使用这个线程的代码(最高赞成答案)Android Client socket , how to read data? 像这样扩展 AsynchTask:
public class InternetTask extends AsyncTask<Void, Integer, Void> {
public static final int BUFFER_SIZE = 2048;
private Socket socket = null;
private PrintWriter out = null;
private BufferedReader in = null;
private int port = 80;
private String host = null;
private static final String TAG="sure2015test";
public InternetTask(String host,int port) {
this.host=host;
this.port=port;
}
@Override
protected Void doInBackground(Void... args) {
connectWithServer();
Log.i(TAG, "Connected");
sendDataWithString("hello");
Log.i(TAG, "Sent data");
String response=receiveDataFromServer();
Log.i(TAG,response);
disConnectWithServer();
return null;
}
private void connectWithServer() {
try {
if (socket == null) {
socket = new Socket(this.host, this.port);
out = new PrintWriter(socket.getOutputStream());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
} catch (IOException e) {
Log.i(TAG,"IO Exeception");
e.printStackTrace();
}
}
private void disConnectWithServer() {
if (socket != null) {
if (socket.isConnected()) {
try {
in.close();
out.close();
socket.close();
} catch (IOException e) {
Log.i(TAG,"IO exception disconnecting");
e.printStackTrace();
}
}
}
}
public void sendDataWithString(String message) {
if (message != null) {
connectWithServer();
out.write(message);
out.flush();
}
}
public String receiveDataFromServer() {
try {
String message = "";
int charsRead = 0;
char[] buffer = new char[BUFFER_SIZE];
Log.i(TAG,"Message before: "+message);
while ((charsRead = in.read(buffer)) != -1) {
message += new String(buffer).substring(0, charsRead);
Log.i(TAG,message);
}
Log.i(TAG,"Message after: "+message);
disConnectWithServer(); // disconnect server
return message;
} catch (IOException e) {
Log.i(TAG,"IO Error in receiving message");
return "Error receiving response: " + e.getMessage();
}
}
}
还有我在 MainActivity.java
中的 onCreate 方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
InternetTask task=new InternetTask("74.125.226.159",80);
task.execute();
}
当我 运行 我在日志中得到这个:
05-16 00:01:04.368 622-637/? I/sure2015test﹕ Connected
05-16 00:01:04.369 622-637/? I/sure2015test﹕ Sent data
05-16 00:01:04.369 622-637/? I/sure2015test﹕ Message before:
05-16 00:03:04.405 622-637/com.example.connorstein.sockethelloworld I/sure2015test﹕ Message after:
所以在IP为google的80端口上打开套接字时没有异常,发送或接收数据也没有异常。看起来我只是没有回应。这是预期的,因为我发送的数据 ("hello") 没有意义吗?我想至少我会得到一个回复,说无效请求或类似的东西。我也试过发送"GET / HTTP/1.0",但也没有回应。
Google 响应空白,因为您没有向它发送正确的 HTTP 请求。模仿普通网络浏览器的请求,您将得到响应。 HTTP 是建立在 TCP 之上的协议。您需要遵循协议才能从服务器中获取有用的信息。
获得响应的最小浏览器示例header:
GET / HTTP/1.1\r\nUser-Agent: curl/7.37.1\r\nHost: www.google.com\r\nAccept: */*\r\n\r\n
考虑使用 SSH 服务器,而不是使用 Web 服务器。 SSH 服务器将发送类似...
SSH-2.0-OpenSSH_5.3\r\n
...连接时。始终响应的服务器更容易对客户端代码进行故障排除。请注意,您可能会让系统管理员疯狂地不断连接到他们的 ssh 服务器。您可能想要设置自己的测试对象。
我想打开一个 TCP 连接以将数据发送到 android 应用程序中的一个 IP 地址。我发现的每个套接字编程 article/thread 都显示了客户端和服务器端代码(通常是聊天程序)。是否可以只在 android 设备上使用客户端代码 运行ning 并将任意数据发送到例如 google 的 IP 地址?现在我在 class 中使用这个线程的代码(最高赞成答案)Android Client socket , how to read data? 像这样扩展 AsynchTask:
public class InternetTask extends AsyncTask<Void, Integer, Void> {
public static final int BUFFER_SIZE = 2048;
private Socket socket = null;
private PrintWriter out = null;
private BufferedReader in = null;
private int port = 80;
private String host = null;
private static final String TAG="sure2015test";
public InternetTask(String host,int port) {
this.host=host;
this.port=port;
}
@Override
protected Void doInBackground(Void... args) {
connectWithServer();
Log.i(TAG, "Connected");
sendDataWithString("hello");
Log.i(TAG, "Sent data");
String response=receiveDataFromServer();
Log.i(TAG,response);
disConnectWithServer();
return null;
}
private void connectWithServer() {
try {
if (socket == null) {
socket = new Socket(this.host, this.port);
out = new PrintWriter(socket.getOutputStream());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
} catch (IOException e) {
Log.i(TAG,"IO Exeception");
e.printStackTrace();
}
}
private void disConnectWithServer() {
if (socket != null) {
if (socket.isConnected()) {
try {
in.close();
out.close();
socket.close();
} catch (IOException e) {
Log.i(TAG,"IO exception disconnecting");
e.printStackTrace();
}
}
}
}
public void sendDataWithString(String message) {
if (message != null) {
connectWithServer();
out.write(message);
out.flush();
}
}
public String receiveDataFromServer() {
try {
String message = "";
int charsRead = 0;
char[] buffer = new char[BUFFER_SIZE];
Log.i(TAG,"Message before: "+message);
while ((charsRead = in.read(buffer)) != -1) {
message += new String(buffer).substring(0, charsRead);
Log.i(TAG,message);
}
Log.i(TAG,"Message after: "+message);
disConnectWithServer(); // disconnect server
return message;
} catch (IOException e) {
Log.i(TAG,"IO Error in receiving message");
return "Error receiving response: " + e.getMessage();
}
}
}
还有我在 MainActivity.java
中的 onCreate 方法@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
InternetTask task=new InternetTask("74.125.226.159",80);
task.execute();
}
当我 运行 我在日志中得到这个:
05-16 00:01:04.368 622-637/? I/sure2015test﹕ Connected
05-16 00:01:04.369 622-637/? I/sure2015test﹕ Sent data
05-16 00:01:04.369 622-637/? I/sure2015test﹕ Message before:
05-16 00:03:04.405 622-637/com.example.connorstein.sockethelloworld I/sure2015test﹕ Message after:
所以在IP为google的80端口上打开套接字时没有异常,发送或接收数据也没有异常。看起来我只是没有回应。这是预期的,因为我发送的数据 ("hello") 没有意义吗?我想至少我会得到一个回复,说无效请求或类似的东西。我也试过发送"GET / HTTP/1.0",但也没有回应。
Google 响应空白,因为您没有向它发送正确的 HTTP 请求。模仿普通网络浏览器的请求,您将得到响应。 HTTP 是建立在 TCP 之上的协议。您需要遵循协议才能从服务器中获取有用的信息。
获得响应的最小浏览器示例header:
GET / HTTP/1.1\r\nUser-Agent: curl/7.37.1\r\nHost: www.google.com\r\nAccept: */*\r\n\r\n
考虑使用 SSH 服务器,而不是使用 Web 服务器。 SSH 服务器将发送类似...
SSH-2.0-OpenSSH_5.3\r\n
...连接时。始终响应的服务器更容易对客户端代码进行故障排除。请注意,您可能会让系统管理员疯狂地不断连接到他们的 ssh 服务器。您可能想要设置自己的测试对象。