Android中的socket通信

用Java中的socket编程。

通过socket实现两个应用之间的通信,可以接收和发送数据,同时将接收到的数据显示在activity界面上。

Server端:

ServerLastly.java

package com.example.driverexam;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

import android.os.Handler;
import android.os.Message;
import android.util.Log;

/**
 * 通过Socket实现
 * @author Administrator
 *
 */
public class ServerLastly implements Runnable{
    private static final String TAG="ServerLastly";
    ServerSocket server;
    Socket client;
    PrintWriter os;
    BufferedReader is;

    Handler handler;

    /**
     * 此处不将连接代码写在构造方法中的原因:
     * 我在activity的onCreate()中创建示例,如果将连接代码 写在构造方法中,服务端会一直等待客户端连接,界面没有去描绘,会一直出现白屏。
     * 直到客户端连接上了,界面才会描绘出来。原因是构造方法阻塞了主线程,要另开一个线程。在这里我将它写在了run()中。
     */
    ServerLastly(Handler handler){
        this.handler=handler;
//        Log.i(TAG, "Server=======打开服务=========");
//        try {
//            server=new ServerSocket(8888);
//            client=server.accept();
//            Log.i(TAG, "Server=======客户端连接成功=========");
//             InetAddress inetAddress=client.getInetAddress();
//             String ip=inetAddress.getHostAddress();
//            Log.i(TAG, "===客户端ID为:"+ip);
//            os=new PrintWriter(client.getOutputStream());
//            is=new BufferedReader(new InputStreamReader(client.getInputStream()));
//
//        } catch (IOException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
    }

    //发数据
    public void send(String data){
        if (os!=null) {
            os.println(data);
            os.flush();
        }
    }

    //接数据
    @Override
    public void run() {
        Log.i(TAG, "Server=======打开服务=========");
        try {
            server=new ServerSocket(8080);
            client=server.accept();
            Log.i(TAG, "Server=======客户端连接成功=========");
             InetAddress inetAddress=client.getInetAddress();
             String ip=inetAddress.getHostAddress();
            Log.i(TAG, "===客户端ID为:"+ip);
            os=new PrintWriter(client.getOutputStream());
            is=new BufferedReader(new InputStreamReader(client.getInputStream()));

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        String result="";
        while(true){
            try {
                result=is.readLine();
                Log.i(TAG, "服务端接到的数据为:"+result);
                //把数据带回activity显示
                Message msg=handler.obtainMessage();
                msg.obj=result;
                msg.arg1=0x11;
                handler.sendMessage(msg);

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    public void close(){
        try {
            if (os!=null) {
                os.close();
            }
            if (is!=null) {
                is.close();
            }
            if(client!=null){
                client.close();
            }
            if (server!=null) {
                server.close();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

ServerFinallyActivity.java

package com.example.driverexam;

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

public class ServerFinallyActivity extends Activity {

    EditText et_serverSend;
    TextView tv_showReceiveData;

//    ServerFinally server;

    ServerLastly server;
    StringBuffer receiveData=new StringBuffer();

    Handler handler=new Handler(new Handler.Callback() {

        @Override
        public boolean handleMessage(Message msg) {
            if (msg.arg1==0x11) {
                receiveData.append((String)msg.obj);
                tv_showReceiveData.setText(receiveData);
                receiveData.append("\r\n");
            }

            return false;
        }
    });

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_server_finally);
        et_serverSend=(EditText) findViewById(R.id.et_serverSend);
        tv_showReceiveData=(TextView) findViewById(R.id.tv_showReceiveData);

//        server=new ServerFinally();
//        new Thread(server).start();

        server=new ServerLastly(handler);
        new Thread(server).start();

    }

    //发数据
    public void btn_serverSend(View view){
        server.send(et_serverSend.getText().toString()+"");
        et_serverSend.setText("");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        server.close();
    }

}

Client端:

ClientLastly.java

package com.fqhx.remoteserviceclient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

import android.os.Handler;
import android.os.Message;
import android.util.Log;

/**
 * 通过socket实现
 * @author Administrator
 *
 */
public class ClientLastly implements Runnable{
    private static final String TAG="ClientLastly";
    private static final String NAME="com.repackaging.localsocket";
    private int timeout=30000;
    Socket client;
    PrintWriter os;
    BufferedReader is;

    Handler handler;

    ClientLastly(Handler handler){
        this.handler=handler;
//        try {
//            //连接服务器
//            client=new Socket("localhost", 8888);
//            Log.i(TAG, "Client=======连接服务器成功=========");
//            client.setSoTimeout(timeout);
//            os=new PrintWriter(client.getOutputStream());
//            is=new BufferedReader(new InputStreamReader(client.getInputStream()));
//        } catch (IOException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
    }

    //发数据
    public void send(String data){
        Log.i(TAG, "Client=======data=========");
        if (os!=null) {
            os.println(data);
            os.flush();
        }
    }

    //接收据
    @Override
    public void run() {
        try {
            //连接服务器
//            client=new Socket("192.168.191.1", 8080);
            client=new Socket("localhost", 8080);
            Log.i(TAG, "Client=======连接服务器成功=========");
            client.setSoTimeout(timeout);
            os=new PrintWriter(client.getOutputStream());
            is=new BufferedReader(new InputStreamReader(client.getInputStream()));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        String result="";
        while(true){
            try {
                result=is.readLine();
                Log.i(TAG, "客户端接到的数据为:"+result);
                //将数据带回acitvity显示
                Message msg=handler.obtainMessage();
                msg.arg1=0x12;
                msg.obj=result;
                handler.sendMessage(msg);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    public void close(){
        try {
            if (os!=null) {
                os.close();
            }
            if (is!=null) {
                is.close();
            }
            if(client!=null){
            client.close();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

ClientFinallyActivity.java

package com.fqhx.remoteserviceclient;

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

public class ClientFinallyActivity extends Activity {

//    ClientFinally client;
    EditText et_clientSend;
    TextView tv_showReceiveDataClient;

    ClientLastly client;
    StringBuffer receiveData=new StringBuffer();

    Handler handler=new Handler(new Handler.Callback() {

        @Override
        public boolean handleMessage(Message msg) {
            if (msg.arg1==0x12) {
                receiveData.append((String)msg.obj);
                tv_showReceiveDataClient.setText(receiveData);
                receiveData.append("\r\n");
            }

            return false;
        }
    });

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

        et_clientSend=(EditText) findViewById(R.id.et_clientSend);
        tv_showReceiveDataClient=(TextView) findViewById(R.id.tv_showReceiveDataClient);

//        client=new ClientFinally();
//        new Thread(client).start();

        client=new ClientLastly(handler);
        new Thread(client).start();
    }

    public void btn_clientSend(View view){
        client.send(et_clientSend.getText().toString()+"");
        et_clientSend.setText("");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        client.close();
    }
}
时间: 2024-08-03 21:12:56

Android中的socket通信的相关文章

android中非阻塞socket通信

1.什么是同步与异步,阻塞与非阻塞 首先我们要明白搞明白:同步就等于阻塞?异步就等于非阻塞?这是不对的,同步不等于阻 塞,而异步也不等于非阻塞. 1)那什么是同步编程? 什么是同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.根据这个定义,android中绝大多数函数都是同步调用.但是一般而言,我们在谈论同步.异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务.在android中,由于主线程(UI线程的不安全性),我们经常会用到handler的SendMessage

Android中的常见通信机制和Linux中的通信机制

Handler Handler是Android系统中的一种消息传递机制,起作用是应对多线程场景.将A进程的消息传递给B线程,实现异步消息处理.很多情况是将工作线程中需要更新UI的操作消息传递给UI主线程,而实现更新UI操作. 因为工作线程和主线程是共享地址空间,即Handler实例对象mHandler位于线程间共享的内存堆上,工作线程和主线程直接使用该对象,只需要注意多线程的同步问题.工作系统通过mHandler向其成员变量MessageQueue中添加Message,而主线程一直处于loop中

OC中的socket通信

现在很多客户端和服务器之间的交互都是通过JSON或者XML进行的,但是有时候如果数据量较小,JSON和XML就显得比较冗余 •Socket允许使用长连接,允许应用程序运行在异步模式(提高效率),只有在需要的时候才接收数据 •在iOS中以NSStream(流)来发送和接收数据 •可以设置流的代理,对流状态的变化做出相应 –连接建立 –接收到数据 –连接关闭 – 1.NSStream:数据流的父类,用于定义抽象特性,例如:打开.关闭代理,NSStream继承自CFStream(Core Founda

Android中的HTTP通信

前言:近期在慕课网学习了慕课网课程Android中的HTTP通信,就自己总结了一下,其中参考了不少博文,感谢大家的分享. 文章内容包括:1.HTTP简介2.HTTP/1.0和HTTP/1.1之间的区别3.HTTP的请求头.响应头和状态码4.Android中的HttpUrlConnection 1.Http简介Http(Hypertext transfer protocol)定义了浏览器怎么向万维网服务器发送万维网文档,以及服务器怎么将文档发送给服务器.从层次上看,http是面向应用层协议的,它是

Android开发笔记(一百一十一)聊天室中的Socket通信

Socket通信 基本概念 对于程序开发来说,网络通信的基础就是Socket,但因为是基础,所以用起来不容易,今天我们就来谈谈Socket通信.计算机网络有个大名鼎鼎的TCP/IP协议,普通用户在电脑上设置本地连接的ip时,便经常看到下图的弹窗,注意红框部分已经很好地描述了TCP/IP协议的作用. TCP/IP是个协议组,它分为三个层次:网络层.传输层和应用层: 网络层包括:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 传输层包括:TCP协议.UDP协议. 应用层包括:HT

从零开始学android -- 简易的socket通信

先来介绍下socket,网上摘抄点资料,免得自己打字了 网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 1.消息传递(管道.FIFO.消息队列) 2.同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 3.共享内存(匿名的和具名的) 4.远程过程调用(Solaris门和Sun RPC) 但这些都不是本文的主题!我们要讨论的是网络中进程之间如何通信?首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但

python中的socket通信

协议的概念 不同的国家说不同的语言人门想沟通就需要用英语,只要有一种大家都认可都遵守的协议即可,这种方式在计算机上要遵守的网络通信协议叫做TCP/IP协议早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Microsoft都有各自的网络协议,互不兼容为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议簇(Internet Protocol Suite)就是通用协议标准.因为互联网协议包含了上百种协议标准,但是最重要的两个

Android中线程间通信原理分析:Looper,MessageQueue,Handler

自问自答的两个问题 在我们去讨论Handler,Looper,MessageQueue的关系之前,我们需要先问两个问题: 1.这一套东西搞出来是为了解决什么问题呢? 2.如果让我们来解决这个问题该怎么做? 以上者两个问题,是我最近总结出来的,在我们学习了解一个新的技术之前,最好是先能回答这两个问题,这样你才能对你正在学习的东西有更深刻的认识. 第一个问题:google的程序员们搞出这一套东西是为了解决什么问题的?这个问题很显而易见,为了解决线程间通信的问题.我们都知道,Android的UI/Vi

android中非堵塞socket通信

1.什么是同步与异步,堵塞与非堵塞 首先我们要明确搞明确:同步就等于堵塞?异步就等于非堵塞?这是不正确的,同步不等于阻 塞.而异步也不等于非堵塞. 1)那什么是同步编程? 什么是同步,就是在发出一个功能调用时.在没有得到结果之前,该调用就不返回.依据这个定义.android中绝大多数函数都是同步调用.可是一般而言.我们在谈论同步.异步的时候,特指那些须要其它部件协作或者须要一定时间完毕的任务.在android中,因为主线程(UI线程的不安全性),我们常常会用到handler的SendMessag