Android中socket初体验

  最近要做一个Android的项目,用到socket和服务器之间交互,研究了一个小demo。主要遇到了以下几个问题:

  1.客户端创建socket对象时一直失败NetworkOnMainThreadException,查了一下,原因是4.0之后在主线程中执行http请求会报这个错。解决办法是将代码放到了一个新线程中,问题就解决了。

  2.服务器接收到客户端信息后反馈给客户端信息,将该信息表示在客户端UI上时报“android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.”异常。该问题原因是,在主线线程之外的线程中直接更新页面显示常会报错。解决办法是通过runOnUiThread方法将线程对象传过去,这样在主线程中就能执行该线程的内容了,当然还有其他办法。可参考链接http://blog.csdn.net/shenyuemei/article/details/11030679

  

  下面是程序代码:

  布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/et_hint" />

    <Button
        android:id="@+id/send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/txt_send" />

       <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

服务端代码

package testDemo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server implements Runnable {
    public static void main(String[] args) {
        Thread desktopServerThread = new Thread(new Server());
        desktopServerThread.start();
    }

    @Override
    public void run() {
        try {
            ServerSocket serverSocket = new ServerSocket(8888);
            while (true) {

                // 阻塞,等待接收客户请求。
                Socket client = serverSocket.accept();
                System.out.println("接受到客户端的请求。");
                try {
                    BufferedReader in = new BufferedReader(
                            new InputStreamReader(client.getInputStream()));
                    // 读取客户端发过来的信息
                    String read = in.readLine();
                    System.out.println("客户端发送消息为 : " + read);

                    // 向客户端返回信息
                    PrintWriter out = new PrintWriter(new BufferedWriter(
                            new OutputStreamWriter(client.getOutputStream())));
                    if (read != null) {
                        out.println("你发送给服务器的信息为 : " + read);
                        out.flush();
                    }    

                    out.close();
                    in.close();

                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    client.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

客户端代码

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class ClientActivity extends Activity {

    private Button send = null;
    private EditText content = null;
    private TextView tv = null;
    String msg = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.socket2);

        send = (Button)findViewById(R.id.send);
        content = (EditText)findViewById(R.id.content);
        tv = (TextView)findViewById(R.id.tv);

        send.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                setTitle("socket");
                new Thread(thread1).start();
            }

        });
    }

    /*Handler myHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            myHandler.post(thread1);
        }
    };*/

    /**
     * 该线程主要是向服务器发送消息和接收消息
     */
    Runnable thread1 = new Runnable() {

        @Override
        public void run() {
            Socket socket = null;
            try {
                InetAddress serverAddr = InetAddress.getByName("192.168.1.110");

                socket = new Socket(serverAddr, 8888);
                //想服务器发送消息
                PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
                out.println(content.getText().toString());
                out.flush();

                //读取服务器返回的消息
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                msg = in.readLine();
                //把该子线程当做参数传递,这样在主UI线程就可更新UI
                ClientActivity.this.runOnUiThread(updateThread);

            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    };

    Runnable updateThread = new Runnable() {

        @Override
        public void run() {
            if (msg != null) {
                tv.setText(msg);
            } else {
                tv.setText("data error.");
            }
        }

    };

}

Android中socket初体验

时间: 2024-11-07 02:09:28

Android中socket初体验的相关文章

Android中Socket大文件断点上传

什么是Socket? 所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信连的句柄,应用程序通常通过“套接字”向网络发送请求或者应答网络请求,它就是网络通信过程中端点的抽象表示.它主要包括以下两个协议: TCP (Transmission Control Protocol 传输控制协议):传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据.TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功

Android Studio Git初体验

写这一篇呢就是要给自己提个醒,不会的一定要及时问,不要自以为然,最后给自己埋下一个坑. git我用的是Git bash+Git extensions图形可视化工具.加入项目之初,就用这两个工具去clone了一份项目到本地.项目文件包括后台,微信,网站,IOS和Android的几大分支. 于是我就心满意足地进行开发,在Android Studio中就可以导入项目了,当时为了方便,直接open打开了Android目录的文件..... 这就是大坑,然后呢,我就开始写layout,类,适配器,接口(幸好

[Android初级]android与netty4初体验

博主曾经对netty4的helloword很感兴趣,也曾单纯的写过一个小小的聊天室java代码,现在重新来看看,浏览了这位牛人的博客 点击去看看 我觉得受益匪浅,故拿来分享. 这次是在android上使用netty作为客户端,来与服务端相互通讯的小事例,纯粹的helloworld,效果就是在android程序中发送一个消息到服务端,然后服务端也回一个消息给客户端,很简单的demo,.大牛看了可不要吐槽啊! 1.demo结构 2.服务端代码: Server.java package org.jan

Android Studio之初体验 ---- 很好很强大

一.介绍 很多android 开发者都感叹做android开发竟然都没有一款专门的软件来使用,不像IOS有Xcode,WP有VS.一般做android开发都是eclipse或者ADT或者IntelliJ IDEA.后来,终于,哈哈,有了Android Studio.人称"亲生"的android开发IDE,本人使用了一段时间之后,发现功能真是强大,完爆eclipse等开发工具,最大的亮点就是[代码提示]和[实时预览布局]这两块. 官网上介绍说,Android Studio有诸多好处: 基

二 APPIUM Android自动化 测试初体验

本文转自:http://www.cnblogs.com/sundalian/p/5629358.html 1.创建一个maven项目 成功新建工程: 编辑pom.xml,在<dependencies></dependencies>下添加appium相关依赖: <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <vers

三 APPIUM Android自动化 测试初体验

1.创建一个maven项目 成功新建工程: 编辑pom.xml,在<dependencies></dependencies>下添加appium相关依赖: <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.9.10</version> <scope>test</s

Android 模拟器使用初体验

点击eclipse主菜单的Window->AVD Manager,create一个模拟器,基本填写如下. 遇到的问题: 1.Target选项可选太少. 这是因为SDK包安装太少,可以根据需要添加安装包.比如上图的Google API 17没有,我就装了4.2.2的安装包. 我建工程时选择了target,但是发现实际用的不对,后来发现还是缺少该对应SDK,编辑器自动选择已有的SDK.这是工程已经建好后,要修改工程的Target.如下操作: 弹出框中点左边resource下的Android,然后在右

Android逆向分析初体验

一.    准备知识 1.             懂Java Android开发. 2.             懂NDK ,C 语言 Android 动态链接库.SO开发. 3.             懂Android反编译Smali 语法. 4.             懂adb 和 jdb 等等工具使用. 5.             懂IDA 调试(远程动态调试APK和本地静态调试.SO文件) 6.             懂Arm汇编语法(因为移动设备芯片是Arm架构的,不是Int

Android Studio初体验之启动AVD模拟器异常:cannot set up guest memory &#39;pc.ram&#39;

启动AVD模拟器异常:Cannot set up guest memory 'pc.ram' 错误信息: HAX is working and emulator runs in fast virt mode Cannot set up guest memory 'pc.ram': Invalid argument Error accepting connect 分析 各种查资料,没有发现网上有同样问题的,在一篇相关文章中找到类似的解决方法. 从语意看,应该是hax安装后没有启动.(不懂hax是什