在Android中通过套接字连接到服务器

时间:2014-06-09 16:04:50

标签: java android sockets

我对Android应用程序开发很新,我在我的活动onCreate()下面创建了以下内容:

public String test(){
    String test = "";
    try{
    Socket s = new Socket(InetAddress.getByName("ipaddress"), port#);
    test +=(s.isConnected());

    BufferedReader readFromHost = new BufferedReader(new InputStreamReader(s.getInputStream()));
    readFromHost.ready();


    test += (readFromHost.readLine());
    s.close();
    }catch(Exception e){
        e.printStackTrace();
    }
    return test;

}

这只是路由到:

textView2.setText(test());

但是从服务器获取的字符串“test_message”不会出现在文本视图中。但是,当我做的时候

textView2.setText("hi");

它出现在视图中,或者如果我在android程序之外的java中运行test(),结果“test_message”出现在控制台中。有没有想过为什么它没有出现在Android运行时?港口处理方式不同吗?任何帮助都会很棒。

附件是LogCat。似乎有“NetworkOnMainThreadException”?

程序中发生的所有事情是您单击一个按钮,该按钮将使用textview打开一个新活动。

记录:

06-09 12:13:18.189: W/ApplicationPackageManager(4768): getCSCPackageItemText()
06-09 12:13:18.239: E/MoreInfoHPW_ViewGroup(4768): Parent view is not a TextView
06-09 12:13:18.369: E/SpannableStringBuilder(4768): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
06-09 12:13:18.369: E/SpannableStringBuilder(4768): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
06-09 12:13:22.773: W/ApplicationPackageManager(4768): getCSCPackageItemText()

06-09 12:13:22.783: W/System.err(4768): android.os.NetworkOnMainThreadException
06-09 12:13:22.783: W/System.err(4768):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1156)
06-09 12:13:22.783: W/System.err(4768):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
06-09 12:13:22.783: W/System.err(4768):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
06-09 12:13:22.783: W/System.err(4768):     at libcore.io.IoBridge.connect(IoBridge.java:112)
06-09 12:13:22.783: W/System.err(4768):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
06-09 12:13:22.783: W/System.err(4768):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
06-09 12:13:22.783: W/System.err(4768):     at java.net.Socket.startupSocket(Socket.java:566)
06-09 12:13:22.783: W/System.err(4768):     at java.net.Socket.<init>(Socket.java:226)
06-09 12:13:22.783: W/System.err(4768):     at com.example.myfirstapp.DisplayMessageActivity.test(DisplayMessageActivity.java:42)
06-09 12:13:22.783: W/System.err(4768):     at com.example.myfirstapp.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:31)
06-09 12:13:22.783: W/System.err(4768):     at android.app.Activity.performCreate(Activity.java:5426)
06-09 12:13:22.783: W/System.err(4768):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
06-09 12:13:22.783: W/System.err(4768):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
06-09 12:13:22.783: W/System.err(4768):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
06-09 12:13:22.783: W/System.err(4768):     at android.app.ActivityThread.access$900(ActivityThread.java:161)
06-09 12:13:22.783: W/System.err(4768):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
06-09 12:13:22.783: W/System.err(4768):     at android.os.Handler.dispatchMessage(Handler.java:102)
06-09 12:13:22.783: W/System.err(4768):     at android.os.Looper.loop(Looper.java:157)
06-09 12:13:22.783: W/System.err(4768):     at android.app.ActivityThread.main(ActivityThread.java:5356)
06-09 12:13:22.783: W/System.err(4768):     at java.lang.reflect.Method.invokeNative(Native Method)
06-09 12:13:22.783: W/System.err(4768):     at java.lang.reflect.Method.invoke(Method.java:515)
06-09 12:13:22.783: W/System.err(4768):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
06-09 12:13:22.783: W/System.err(4768):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
06-09 12:13:22.783: W/System.err(4768):     at dalvik.system.NativeStart.main(Native Method)
06-09 12:13:22.803: E/MoreInfoHPW_ViewGroup(4768): Parent view is not a TextView

1 个答案:

答案 0 :(得分:1)

您无法在Main Thread中执行网络请求。创建自己的Thread并从服务器获取字符串:

private TextView textView2;

public void test(){

    new Thread(new Runnable() {
        @Override
        public void run() {
            final StringBuilder test = new StringBuilder();
            try{
                Socket s = new Socket(InetAddress.getByName("ipaddress"), 1111);
                test.append(s.isConnected());

                BufferedReader readFromHost = new BufferedReader(new InputStreamReader(s.getInputStream()));
                readFromHost.ready();


                test.append(readFromHost.readLine());
                s.close();
            }catch(Exception e){
                e.printStackTrace();
            }

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    textView2.setText(test.toString());
                }
            });
        }
    }).start();
}