Android的插座不能被实例化 [英] Android Socket not being instantiated

查看:135
本文介绍了Android的插座不能被实例化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我发现的问题是,插座没有被实例化,我想不通为什么。任何指导,将AP preciated,我是新来的Andr​​oid和想学习。

首先我在清单权限:

 <使用许可权的android:NAME =android.permission.INTERNET对/>
<使用许可权的android:NAME =android.permission.ACCESS_NETWORK_STATE/>

接下来我的.java类,一个线程被称为上的触摸事件:

 新主题(新的ClientThread())开始();

最后,我们纷纷跟帖:

 类ClientThread实现Runnable
{
    @覆盖
    公共无效的run()
    {
        ConnectivityManager connMgr =(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        的NetworkInfo NETWORKINFO = connMgr.getActiveNetworkInfo();
        如果(NETWORKINFO = NULL&放大器;!&安培; networkInfo.isConnected())
        {
            尝试
            {
                Log.i(项目,SERVER_IP);
                InetAddress类serverAddr = InetAddress.getByName(SERVER_IP);
                Log.i(项目,serverAddr.toString());                Log.i(项目,将String.valueOf(SERVERPORT));
                插座=新的Socket(serverAddr,SERVERPORT);
                Log.i(项目,创造插座);                OutputStream的OUT = socket.getOutputStream();                Log.i(项目,开放漆作家);
                PrintWriter的输出=新的PrintWriter(出);                Log.i(项目,将数据发送到PC);
                output.println(你好于Android);                Log.i(项目,了out.flush);
                了out.flush();                Log.i(项目,out.close);
                out.close();                Log.i(项目,数据传送到PC,关闭套接字);
                socket.close();
            }
            赶上(例外五)
            {
                Log.i(IS4432,错误);
                e.printStackTrace();
            }
        }
        其他
        {
            //显示错误
            Log.i(项目,无网络);
        }

我使用日志的寻找到code停止工作,停止对插座=新的Socket(serverAddr,SERVERPORT); 。它也没有捕获任何异常。

编辑 - 解决方案

我从一个线程切换到的AsyncTask 的通知。我实例化的插座,然后再连接它。现在我的应用程序能够将字符串发送到服务器

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

  getSocket任务=新getSocket();
task.execute(新的String [] {占位符});

和方法,我把笔记从教程 www.vogella.com

 私有类getSocket扩展的AsyncTask<弦乐,太虚,字符串>
{
    @覆盖
    保护字符串doInBackground(字符串的URL ...)
    {
        串响应=;
        弦乐味精=你好,从Android和LT; EOF>中;
        插座=新的Socket();
        Log.i(项目,插座实例);        尝试
        {
            socket.connect(新的InetSocketAddress(SERVER_IP,SERVERPORT),5000);
            Log.i(项目,连接制造);            //这个缓冲区从服务器接收数据
            在的BufferedReader =新的BufferedReader(新的InputStreamReader(socket.getInputStream()));
            响应= in.toString();
            Log.i(项目,输入流);            //这一次送
            OutputStream的OUT = socket.getOutputStream();
            Log.i(项目,输出流);            out.write(msg.getBytes(US-ASCII));
            了out.flush();
            Log.i(项目,msg.getBytes()的toString());
        }
        赶上(IOException异常E)
        {
            // TODO自动生成catch块
            e.printStackTrace();
            Log.i(项目,IOException异常);
        }
        赶上(例外五)
        {
            Log.i(项目,出事了);
        }
        返回响应;
    }
}


我的建议是,如果你只是在Android beggining,实施内的的AsyncTask 的插座。这基本上是一个与你需要自己,如果你使用了类控制一些改进。一旦你清楚这一点,你可能要开始与取值自己经历,在我看来,首先是一个主题学习是有点'铁杆'。

开始在你的 doInBackground()方法插座,使用这样的:

 插座=新的Socket();
socket.connect(新的InetSocketAddress(主机,端口),超时);//这个缓冲区从服务器接收数据
在=新的BufferedReader(新的InputStreamReader(socket.getInputStream(),ISO-8859-1));
//这一次送
OUT = socket.getOutputStream();

要在从服务器读取行:

 ,而((缓冲= in.readLine())!= NULL){
  //就我而言,缓冲是一个String
  ...
}

要发送一些东西到服务器:

  //的字符集是因为我的服务器是在西班牙:-)
out.write(msg.getBytes(ISO-8859-1));

I have been working on an Android project that will connect to a C# server on another computer. I have tested the server side with a C# client but I need an Android client to connect from an android tablet.

The problem I have found is that the socket is not being instantiated and I cannot figure out why. Any guidance would be appreciated, I am new to Android and want to learn.

First off my permissions in the manifest:

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

Next in my .java class, a thread is called on a touch event:

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

And finally we have the thread:

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");
        }

I use the Log's to find where the code stops working, it stops on socket = new Socket(serverAddr, SERVERPORT);. It also doesn't catch any exception.

EDIT - Solved Solution

I switched from a thread to an AsyncTask as advised. I instantiated the socket and then connected it. Now my application is able to send a string to the server

First calling the method from a touch event:

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

And the method, I took notes from a tutorial on 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;
    }
}

解决方案

My advice is that if you're just beggining with Android, implement that socket within an AsyncTask. It's basically a Thread with some improvements you'd need to control by yourself if you used the Thread class. Once you're clear about that, you may want start experiencing with Threads themselves, in my opinion starting learning with an Thread is a bit 'hardcore'.

Start that socket in your doInBackground() method, using something like this:

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();

To read lines from the server:

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

To send out something to the server:

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

这篇关于Android的插座不能被实例化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆