【问题标题】:Android Socket not being instantiatedAndroid Socket没有被实例化
【发布时间】:2014-01-24 16:27:14
【问题描述】:

我一直在开发一个将连接到另一台计算机上的 C# 服务器的 Android 项目。我已经使用 C# 客户端测试了服务器端,但我需要一个 Android 客户端才能从 Android 平板电脑连接。

我发现的问题是套接字没有被实例化,我不知道为什么。任何指导将不胜感激,我是 Android 新手并想学习。

首先我在清单中的权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

接下来在我的 .java 类中,在触摸事件上调用一个线程:

new Thread(new ClientThread()).start();

最后我们有了线程:

class ClientThread implements Runnable
{
    @Override
    public void run()
    {
        ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected())
        {
            try
            {
                Log.i("Project", SERVER_IP);
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
                Log.i("Project", serverAddr.toString());

                Log.i("Project", String.valueOf(SERVERPORT));                   
                socket = new Socket(serverAddr, SERVERPORT);
                Log.i("Project", "Socket created");

                OutputStream out = socket.getOutputStream();

                Log.i("Project", "Open paint writer");
                PrintWriter output = new PrintWriter(out);

                Log.i("Project", "Sending Data to PC");
                output.println("Hello from Android");

                Log.i("Project", "out.flush");
                out.flush();

                Log.i("Project", "out.close");
                out.close();

                Log.i("Project", "Data sent to PC, close socket");
                socket.close();
            }
            catch (Exception e)
            {
                Log.i("IS4432", "Error");
                e.printStackTrace();
            }
        }
        else
        {
            // display error
            Log.i("Project", "No Internet");
        }

我使用日志来查找代码停止工作的位置,它停止在socket = new Socket(serverAddr, SERVERPORT);。它也没有捕获任何异常。

编辑 - 已解决的解决方案

我按照建议从线程切换到AsyncTask。我实例化了套接字然后连接它。现在我的应用程序能够向服务器发送一个字符串

首先从触摸事件中调用方法:

getSocket task = new getSocket();
task.execute(new String[] { "PlaceHolder" });

还有方法,我在www.vogella.com上的一个教程里记笔记:

private class getSocket extends AsyncTask<String, Void, String>
{
    @Override
    protected String doInBackground(String... urls)
    {
        String response = "";
        String msg = "Hello, from Android<EOF>";
        socket = new Socket();
        Log.i("Project","Socket instantiated");

        try
        {
            socket.connect(new InetSocketAddress(SERVER_IP, SERVERPORT), 5000);
            Log.i("Project","Connection Made");

            // This buffer to receive data from your server  
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            response = in.toString();
            Log.i("Project","Input Stream");

            // This one to send
            OutputStream out = socket.getOutputStream();
            Log.i("Project","Output Stream");

            out.write(msg.getBytes("US-ASCII"));
            out.flush();
            Log.i("Project", msg.getBytes().toString());
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.i("Project","IOException");
        }
        catch (Exception e)
        {
            Log.i("Project","Something went Wrong");
        }
        return response;
    }
}

【问题讨论】:

  • 请发布 LogCat 错误
  • 必须有。再看一遍。

标签: java android multithreading sockets


【解决方案1】:

我的建议是,如果您刚开始使用 Android,请在 AsyncTask 中实现该套接字。它基本上是一个Thread,如果您使用Thread 类,您需要自己控制一些改进。明确这一点后,您可能希望自己开始体验 Threads,在我看来,从 Thread 开始学习有点“硬核”。

在您的doInBackground() 方法中启动该套接字,使用如下内容:

socket = new Socket();
socket.connect(new InetSocketAddress(host, port), timeout);

// This buffer to receive data from your server  
in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "ISO-8859-1"));
// This one to send
out = socket.getOutputStream();

从服务器读取行:

while ((buffer = in.readLine()) != null) {
  // In my case, buffer is a String
  ...
}

向服务器发送一些东西:

// The charset is because my server is in spanish :-)
out.write(msg.getBytes("ISO-8859-1"));

【讨论】:

  • 感谢您的帮助,我将代码从线程更改为使用 AsyncTask。我不确定是什么修复了它,但更改为 AsyncTask 并修改服务器端解决了它。
猜你喜欢
  • 2014-09-09
  • 1970-01-01
  • 2023-04-09
  • 2013-09-06
  • 2015-05-20
  • 2016-08-25
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多