繁体   English   中英

Android Java Socket套接字TCPIP打开连接

[英]Android Java Socket Socket TCPIP open connection

我需要通过TCPIP连接到服务器。 我发现了如何执行此操作,但是示例并未建立永久连接,它只是连接发送数据并删除了连接。 我需要保持连接打开状态来回传递几个软件包。

例如,我习惯于请求连接,然后有一个过程来侦听传入的数据。 像这样:

  1. 确认连接
  2. 发送数据
  3. 接收数据...回到#3
  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:您可以放心地删除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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM