简单的android客户端的Socket [英] simple android socket client

查看:173
本文介绍了简单的android客户端的Socket的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我非常新手在Android中Java编程中,所以很难算出我的问题了。我有简单的node.js服务器,即只听本地主机:7000和打印任何输入到控制台(它正常工作与我的动作客户端)。我需要做一些事情simmilar了解Android的,只是简单的客户端套接字发送者,即写什么,我可以在我的服务器日志中查看。这里是code,我试图在Eclipse上Android模拟器使用,如果我使用localhost或127.0.0.1它的工作原理没有错误,但没有任何反应(服务器日志是空的),如果我将其更改为我的服务器本地ADRESS(这里是Wi-Fi本地网络和电话使用它)的应用只是把连接错误大冰冻然后关机后。 Simmilar问题手机。

客户端:

 包etc.supachat;进口java.io.BufferedReader中;
进口java.io.IOException异常;
进口java.io.InputStreamReader中;
进口java.io.OutputStream中;
进口的java.io.PrintWriter;
进口java.net.DatagramPacket中;
进口java.net.DatagramSocket中;
进口java.net.InetSocketAddress;
进口的java.net.Socket;
进口java.net.SocketException异常;
进口的java.net.UnknownHostException;
进口android.app.Activity;
进口android.os.Bundle;
进口android.widget.EditText;
进口android.widget.TextView;
公共类SupaChatActivity延伸活动{
    / **当第一次创建活动调用。 * /
    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.main);
        尝试{            插座S =新的Socket(192.168.1.34,7000);            //输出流重定向到插座            OutputStream的OUT = s.getOutputStream();            PrintWriter的输出=新的PrintWriter(出);            output.println(你好Android的!);            输入的BufferedReader =新的BufferedReader(新的InputStreamReader(s.getInputStream()));            //读取线(S)            串ST = input.readLine();            //关闭连接            S.CLOSE();    }赶上(UnknownHostException异常五){            // TODO自动生成catch块            e.printStackTrace();    }赶上(IOException异常五){            // TODO自动生成catch块            e.printStackTrace();    }
    }
}

这是明显的code:
    
    

 <采用-SDK安卓的minSdkVersion =7/>
    <使用许可权的android:NAME =android.permission.INTERNET对/>    <应用
        机器人:图标=@绘制/ ic_launcher
        机器人:标签=@字符串/ APP_NAME>
        <活动
            机器人:名字=。SupaChatActivity
            机器人:标签=@字符串/ APP_NAME>
            &所述;意图滤光器>
                <作用机器人:名字=android.intent.action.MAIN/>                <类机器人:名字=android.intent.category.LAUNCHER/>
            &所述; /意图滤光器>
        < /活性GT;
    < /用途>< /清单>

这是简单的用户界面:
    
    

 < RelativeLayout的
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =WRAP_CONTENT>        <的TextView
            机器人:ID =@ + ID / out_view
            机器人:layout_width =162dp
            机器人:layout_height =WRAP_CONTENT
            机器人:layout_alignParentTop =真
            机器人:layout_centerHorizo​​ntal =真
            机器人:文字=大文本
            机器人:textAppearance =:/>中的Andr​​oid ATTR / textAppearanceLarge?    < / RelativeLayout的>< / LinearLayout中>

更新
这里是Eclipse控制台日志:

  05-05 18:13:49.172:D / AndroidRuntime(1452):>>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit<<<<<<
05-05 18:13:49.172:D / AndroidRuntime(1452):CheckJNI为ON
05-05 18:13:49.921:D / AndroidRuntime(1452):在主入口com.android.commands.pm.Pm
05-05 18:13:49.950:D / AndroidRuntime(1452):关闭VM
05-05 18:13:49.971:D / dalvikvm(1452):GC_CONCURRENT释放101K,71%免费297K / 1024K,外部0K / 0K,暂停7毫秒+ 1毫秒
05-05 18:13:49.971:I / AndroidRuntime(1452):注:连接线的捆扎线#3'失败
05-05 18:13:49.981:D / dalvikvm(1452):调试器脱落;对象注册了1项
05-05 18:13:50.491:D / AndroidRuntime(1462):>>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit<<<<<<
05-05 18:13:50.491:D / AndroidRuntime(1462):CheckJNI为ON
05-05 18:13:51.231:D / AndroidRuntime(1462):在主入口com.android.commands.am.Am
05-05 18:13:51.271:I / ActivityManager(68):开始:意向{行动= android.intent.action.MAIN猫= [android.intent.category.LAUNCHER] FLG = 0x10000000的CMP = etc.supachat /。 SupaChatActivity}从PID 1462
05-05 18:13:51.321:I / ActivityManager(68):启动PROC etc.supachat的活动etc.supachat / .SupaChatActivity:PID = 1470 UID = 10035导报= {} 3003
05-05 18:13:51.362:D / AndroidRuntime(1462):关闭VM
05-05 18:13:51.371:D / dalvikvm(1462):GC_CONCURRENT释放102K,69%免费319K / 1024K,外部0K / 0K,暂停1毫秒+ 1毫秒
05-05 18:13:51.421:D / dalvikvm(1462):调试器脱落;对象注册了1项
05-05 18:14:01.324:W / ActivityManager(68):启动超时已过期,放弃唤醒锁!
05-05 18:14:02.033:W / ActivityManager(68):为HistoryRecord活动空闲超时{406a46a8 etc.supachat / .SupaChatActivity}
05-05 18:14:07.151:D / dalvikvm(137):GC_EXPLICIT释放47K,52%免费2817K / 5831K,4863K外部/ 5566K,暂停84ms
05-05 18:16:19.360:I / InputDispatcher(68):应用程序没有响应:AppWindowToken {407b8948令牌= {HistoryRecord 406a46a8 etc.supachat / .SupaChatActivity}}。自事件5036.3ms,5035.8ms因为等待启动
05-05 18:16:19.360:I /窗口管理器(68):输入事件分派超时发送到应用程序AppWindowToken {407b8948令牌= {HistoryRecord 406a46a8 etc.supachat / .SupaChatActivity}}
05-05 18:16:19.491:I /流程(68):发送信号。 PID:1470 SIG:3
05-05 18:16:19.491的:I / dalvikvm(1470):主题ID = 4:反应以信号3
05-05 18:16:19.520:I / dalvikvm(1470):写的堆栈跟踪到/data/anr/traces.txt
05-05 18:16:19.531:I /流程(68):发送信号。 PID:68 SIG:3
05-05 18:16:19.531的:I / dalvikvm(68):主题ID = 4:反应以信号3
05-05 18:16:19.580:I / dalvikvm(68):写的堆栈跟踪到/data/anr/traces.txt
05-05 18:16:19.580:I /流程(68):发送信号。 PID:125 SIG:3
05-05 18:16:19.590的:I / dalvikvm(125):主题ID = 4:反应以信号3
05-05 18:16:19.610:I / dalvikvm(125):写的堆栈跟踪到/data/anr/traces.txt
05-05 18:16:19.610:I /流程(68):发送信号。 PID:128 SIG:3
05-05 18:16:19.620的:I / dalvikvm(128):主题ID = 4:反应以信号3
05-05 18:16:19.630:I / dalvikvm(128):写的堆栈跟踪到/data/anr/traces.txt
05-05 18:16:20.030:D / dalvikvm(68):GC_EXPLICIT释放789K,47%免费4557K / 8519K,3520K外部/ 3903K,暂停112ms
05-05 18:16:20.720:E / ActivityManager(68):ANR在etc.supachat(etc.supachat / .SupaChatActivity)
05-05 18:16:20.720:E / ActivityManager(68):原因:keyDispatchingTimedOut
05-05 18:16:20.720:E / ActivityManager(68):负载:0.09 / 0.12 / 0.09
05-05 18:16:20.720:E / ActivityManager(68):从14302ms为0ms前CPU使用率:
05-05 18:16:20.720:E / ActivityManager(68):0.4%,68 / system_server:0.2%的用户+ 0.2%的内核
05-05 18:16:20.720:E / ActivityManager(68):0.4%,128 / com.android.systemui:0.2%的用户+ 0.1%,核心/故障:1名未成年人
05-05 18:16:20.720:E / ActivityManager(68):0.1%,125 / com.android.phone:0%用户+ 0.1%的内核
05-05 18:16:20.720:E / ActivityManager(68):0%12 /将pdflush:0%用户+ 0%内核
05-05 18:16:20.720:E / ActivityManager(68):0%332 / logcat中:0%用户+ 0%内核
05-05 18:16:20.720:E / ActivityManager(68):1.6%总计:0.9%的用户+ 0.6%的内核
05-05 18:16:20.720:E / ActivityManager(68):CPU从678ms使用率以后1270ms:
05-05 18:16:20.720:E / ActivityManager(68):8.3%,68 / system_server:3.3%的用户+ 5%的内核
05-05 18:16:20.720:E / ActivityManager(68):8.3%,98 / InputDispatcher:6.6%的用户+ 1.6%的内核
05-05 18:16:20.720:E / ActivityManager(68):13%总计:6.6%的用户+ 6.6%的内核
05-05 18:16:20.750:I / InputDispatcher(68):删除事件,因为指针不下来。
05-05 18:16:23.530:W / ActivityManager(68):强制完成活动etc.supachat / .SupaChatActivity
05-05 18:16:23.550:I / ActivityManager(68):杀死etc.supachat(PID = 1470):用户的请求
05-05 18:16:23.550:I /流程(68):发送信号。 PID:1470 SIG:9
05-05 18:16:23.570:I / ActivityManager(68):过程etc.supachat(PID 1470)已经死亡。
05-05 18:16:23.770:W / InputManagerService(68):窗口已经集中,忽视聚焦增益:com.android.internal.view.IInputMethodClient$Stub$Proxy@406c8c68

更新2 这里是服务器端脚本,与ActionScript的客户端工作(这有点像聊天,我写来了解新的语言和平台):

  VAR净=要求(网),SYS =要求('UTIL');变种名称=阵列();
VAR流=阵列();VAR政策=< XML版本= \\1.0 \\编码= \\UTF-8 \\>? +
< D​​OCTYPE跨域策略SYSTEM \\!HTTP://www.adobe.com/xml/dtds/cross-domain-policy.dtd \\>中+
<交域的策略><允许访问 - 从域= \\* \\到端口= \\* \\/>中+
< /跨域政策> \\ 0;功能onStreamData(数据){
    VAR current_stream =这一点;
    的console.log(数据);
    如果(data.substring(1,20)==策略的文件请求){
        的console.log(ASD);
        current_stream.write(政策);
    }    否则,如果(data.substring(0,6)==[名称]){
        的console.log(名称);
        names.push(data.substring(6,data.length));
        streams.push(current_stream);
    }    其他
    {
        VAR娜;
        对于(i = 0; I< names.length;我++){
            如果(current_stream ==流[I]){
                NA =名称[I]
            }
        }        对于(i = 0; I< names.length;我++){
            如果(流[I]!= NULL){
                流[I] .WRITE(NA +数据+\\ 0);
            }
        }
    }
}功能的OnClose(){
        VAR current_stream =这一点;
        对于(i = 0; I< streams.length;我++){
            如果(流== current_stream){
                streams.splice(I,1);
                names.splice(I,1);
            }
        }
        current_stream.end();
}VAR服务器= net.createServer(函数(流){
    stream.setEncoding(UTF8);
    stream.on(数据,onStreamData);
    stream.on(结束,OnClose中);
});server.listen(7000,127.0.0.1);


解决方案

快速修复:主机可以随时从仿真器访问的IP地址为:10.0.2.2
所以,你应该使用Android的code此IP地址与主机连接。

更多详情这里

Android模拟器是不是在同一个网络上的主机上。而Android模拟器是一个虚拟的网络上,虚拟路由器后面。所以仿真器无法连接到您的主机的私有IP地址。(因为它是一个不同的网络上)。

而当你使用本地主机(或127.0.0.1)购买Android code,这意味着你要访问的Andr​​oid设备,因此它不会在你的情况是有意义的。

I am very novice in Android Java Programming, so it is hard to figure my problem up. I have simple node.js server, that just listen localhost:7000 and print any input into console (it works fine with my actionscript client). I need to do something simmilar to understand Android, just simple client socket sender, that write anything that i can view in my server log. Here is the code, i trying to use on eclipse Android emulator and if i use "localhost" or "127.0.0.1" it works without errors but nothing happens (server log would be empty), and if i change it to my server local adress (here is wi-fi local network and phone uses it) application just throw en error after big freeze then shutdown. Simmilar problem with phone.

Client-side:

package etc.supachat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;


import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;


public class SupaChatActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        
        try {

            Socket s = new Socket("192.168.1.34", 7000);



            //outgoing stream redirect to socket

            OutputStream out = s.getOutputStream();



            PrintWriter output = new PrintWriter(out);

            output.println("Hello Android!");

            BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));



            //read line(s)

            String st = input.readLine();

            //Close connection

            s.close();





    } catch (UnknownHostException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

    } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

    }
    }
}

This is manifest code:

    <uses-sdk android:minSdkVersion="7" />
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".SupaChatActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

And this is simple ui:

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/out_view"
            android:layout_width="162dp"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:text="Large Text"
            android:textAppearance="?android:attr/textAppearanceLarge" />

    </RelativeLayout>

</LinearLayout>

Update Here is eclipse console log:

05-05 18:13:49.172: D/AndroidRuntime(1452): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
05-05 18:13:49.172: D/AndroidRuntime(1452): CheckJNI is ON
05-05 18:13:49.921: D/AndroidRuntime(1452): Calling main entry com.android.commands.pm.Pm
05-05 18:13:49.950: D/AndroidRuntime(1452): Shutting down VM
05-05 18:13:49.971: D/dalvikvm(1452): GC_CONCURRENT freed 101K, 71% free 297K/1024K, external 0K/0K, paused 7ms+1ms
05-05 18:13:49.971: I/AndroidRuntime(1452): NOTE: attach of thread 'Binder Thread #3' failed
05-05 18:13:49.981: D/dalvikvm(1452): Debugger has detached; object registry had 1 entries
05-05 18:13:50.491: D/AndroidRuntime(1462): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
05-05 18:13:50.491: D/AndroidRuntime(1462): CheckJNI is ON
05-05 18:13:51.231: D/AndroidRuntime(1462): Calling main entry com.android.commands.am.Am
05-05 18:13:51.271: I/ActivityManager(68): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=etc.supachat/.SupaChatActivity } from pid 1462
05-05 18:13:51.321: I/ActivityManager(68): Start proc etc.supachat for activity etc.supachat/.SupaChatActivity: pid=1470 uid=10035 gids={3003}
05-05 18:13:51.362: D/AndroidRuntime(1462): Shutting down VM
05-05 18:13:51.371: D/dalvikvm(1462): GC_CONCURRENT freed 102K, 69% free 319K/1024K, external 0K/0K, paused 1ms+1ms
05-05 18:13:51.421: D/dalvikvm(1462): Debugger has detached; object registry had 1 entries
05-05 18:14:01.324: W/ActivityManager(68): Launch timeout has expired, giving up wake lock!
05-05 18:14:02.033: W/ActivityManager(68): Activity idle timeout for HistoryRecord{406a46a8 etc.supachat/.SupaChatActivity}
05-05 18:14:07.151: D/dalvikvm(137): GC_EXPLICIT freed 47K, 52% free 2817K/5831K, external 4863K/5566K, paused 84ms
05-05 18:16:19.360: I/InputDispatcher(68): Application is not responding: AppWindowToken{407b8948 token=HistoryRecord{406a46a8 etc.supachat/.SupaChatActivity}}.  5036.3ms since event, 5035.8ms since wait started
05-05 18:16:19.360: I/WindowManager(68): Input event dispatching timed out sending to application AppWindowToken{407b8948 token=HistoryRecord{406a46a8 etc.supachat/.SupaChatActivity}}
05-05 18:16:19.491: I/Process(68): Sending signal. PID: 1470 SIG: 3
05-05 18:16:19.491: I/dalvikvm(1470): threadid=4: reacting to signal 3
05-05 18:16:19.520: I/dalvikvm(1470): Wrote stack traces to '/data/anr/traces.txt'
05-05 18:16:19.531: I/Process(68): Sending signal. PID: 68 SIG: 3
05-05 18:16:19.531: I/dalvikvm(68): threadid=4: reacting to signal 3
05-05 18:16:19.580: I/dalvikvm(68): Wrote stack traces to '/data/anr/traces.txt'
05-05 18:16:19.580: I/Process(68): Sending signal. PID: 125 SIG: 3
05-05 18:16:19.590: I/dalvikvm(125): threadid=4: reacting to signal 3
05-05 18:16:19.610: I/dalvikvm(125): Wrote stack traces to '/data/anr/traces.txt'
05-05 18:16:19.610: I/Process(68): Sending signal. PID: 128 SIG: 3
05-05 18:16:19.620: I/dalvikvm(128): threadid=4: reacting to signal 3
05-05 18:16:19.630: I/dalvikvm(128): Wrote stack traces to '/data/anr/traces.txt'
05-05 18:16:20.030: D/dalvikvm(68): GC_EXPLICIT freed 789K, 47% free 4557K/8519K, external 3520K/3903K, paused 112ms
05-05 18:16:20.720: E/ActivityManager(68): ANR in etc.supachat (etc.supachat/.SupaChatActivity)
05-05 18:16:20.720: E/ActivityManager(68): Reason: keyDispatchingTimedOut
05-05 18:16:20.720: E/ActivityManager(68): Load: 0.09 / 0.12 / 0.09
05-05 18:16:20.720: E/ActivityManager(68): CPU usage from 14302ms to 0ms ago:
05-05 18:16:20.720: E/ActivityManager(68):   0.4% 68/system_server: 0.2% user + 0.2% kernel
05-05 18:16:20.720: E/ActivityManager(68):   0.4% 128/com.android.systemui: 0.2% user + 0.1% kernel / faults: 1 minor
05-05 18:16:20.720: E/ActivityManager(68):   0.1% 125/com.android.phone: 0% user + 0.1% kernel
05-05 18:16:20.720: E/ActivityManager(68):   0% 12/pdflush: 0% user + 0% kernel
05-05 18:16:20.720: E/ActivityManager(68):   0% 332/logcat: 0% user + 0% kernel
05-05 18:16:20.720: E/ActivityManager(68): 1.6% TOTAL: 0.9% user + 0.6% kernel
05-05 18:16:20.720: E/ActivityManager(68): CPU usage from 678ms to 1270ms later:
05-05 18:16:20.720: E/ActivityManager(68):   8.3% 68/system_server: 3.3% user + 5% kernel
05-05 18:16:20.720: E/ActivityManager(68):     8.3% 98/InputDispatcher: 6.6% user + 1.6% kernel
05-05 18:16:20.720: E/ActivityManager(68): 13% TOTAL: 6.6% user + 6.6% kernel
05-05 18:16:20.750: I/InputDispatcher(68): Dropping event because the pointer is not down.
05-05 18:16:23.530: W/ActivityManager(68):   Force finishing activity etc.supachat/.SupaChatActivity
05-05 18:16:23.550: I/ActivityManager(68): Killing etc.supachat (pid=1470): user's request
05-05 18:16:23.550: I/Process(68): Sending signal. PID: 1470 SIG: 9
05-05 18:16:23.570: I/ActivityManager(68): Process etc.supachat (pid 1470) has died.
05-05 18:16:23.770: W/InputManagerService(68): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@406c8c68

Update 2. Here is the server-side script, that works with actionscript-client (it is something like chat, that i write to understand new language and platform):

var net = require("net"), sys = require('util');

var names = Array();
var streams = Array();

var policy = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<!DOCTYPE cross-domain-policy SYSTEM \"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd\">" +
"<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" />" +
"</cross-domain-policy>\0";

function onStreamData(data){
    var current_stream = this;
    console.log(data);
    if(data.substring(1,20) == "policy-file-request"){
        console.log("asd");
        current_stream.write(policy);
    }

    else if(data.substring(0,6) == "[name]"){
        console.log("name");
        names.push(data.substring(6, data.length));
        streams.push(current_stream);
    }

    else
    {   
        var na;
        for(i =0; i<names.length; i++){
            if(current_stream == streams[i]){
                na = names[i]
            }
        }

        for(i =0; i<names.length; i++){
            if(streams[i]!=null){
                streams[i].write(na+data+"\0");
            }
        }
    }
}

function onClose(){
        var current_stream = this;
        for(i = 0; i<streams.length; i++){
            if(streams == current_stream){
                streams.splice(i, 1);
                names.splice(i, 1);
            }
        }
        current_stream.end();
}

var server = net.createServer(function (stream) {
    stream.setEncoding("utf8");
    stream.on('data', onStreamData);
    stream.on('end', onClose);
});

server.listen(7000, "127.0.0.1");

解决方案

Quick fix: Host computer can always be accessed from emulator with IP address: 10.0.2.2 So you should use this ip address in android code to connect with host computer.

Further Details(here):

Android emulator is not on the same network as on which the host computer is. Rather android emulator is on a virtual network, behind a virtual router. So the emulator cannot connect to private ip address of your host computer.(Since it is on a different network).

And when you use localhost(or 127.0.0.1) in android code, it means that you want to access the android device so it does not make sense in your case.

这篇关于简单的android客户端的Socket的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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