Android Java Socket Socket TCPIP开放连接

时间:2010-12-29 23:45:55

标签: java android sockets tcp

我需要通过TCPIP连接到服务器。我发现了如何做到这一点,但是示例没有建立永久连接,只是连接发送数据并丢弃连接。我需要打开连接来传递几个包。

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

  1. 连接
  2. 确认连接
  3. 发送数据
  4. 接收数据......回到#3
  5. 关闭连接。
  6. 有什么我可以阅读这个或更好的示例代码吗?

3 个答案:

答案 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”?