热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android实现实时通信示例

我们今天来聊下如何做实时通讯(先给知识点,实现原理,最后给出实现实时通信的具体代码--使用工具 android studio) 现在先说下

我们今天来聊下如何做实时通讯(先给知识点,实现原理,最后给出实现实时通信的具体代码--使用工具 android studio)
现在先说下用到的知识点:

  1. java的socket包括服务端和客户端,  这个是用来实现通信
  2. java的多线程,这个是用来实现实时通信
  3. java的线程通信,实现界面实时更新

实现原理

就是将发送端,接收端分别放进一个线程去运行,然后利用线程通信类handler来进行线程间的通信,实现界面的通信

实现代码:

权限




Layout   

<&#63;xml version="1.0" encoding="utf-8"&#63;>

  

客户端类

package com.ysp.asus.experiment_02;

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

/**
 * Created by asus on 2017/3/16.
 */

public class ChatClient {
  public Socket requestSocket(String host) throws UnknownHostException,IOException{
    Socket socket=new Socket(host,5000);
    return socket;
  }

  public void sendMsg(Socket socket,String msg)throws IOException{
    BufferedWriter writer=new BufferedWriter(
        new OutputStreamWriter(socket.getOutputStream())
    );
    writer.write(msg.replace("\n","")+"\n");
    writer.flush();
  }

  public String receiveMsg(Socket socket)throws IOException{
    BufferedReader reader=new BufferedReader(
        new InputStreamReader(socket.getInputStream())
    );
    String txt=reader.readLine();
    return txt;
  }
}

服务端类

package com.ysp.asus.experiment_02;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

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

/**
 * Created by asus on 2017/3/16.
 */

public class ChatServer extends Thread {
  public  ChatServer() throws IOException {
      createSocket();
  }
  public void run(){
    Socket client;
    String txt;
    Log.i("信息","成功开始服务器,端口为:"+PORT);
    try{
      while (true){
        client=ResponseSocket();
        while(true){
          txt=ReceiveMsg(client);
          System.out.println(txt);
          Message message1 = new Message();
          message1.obj =txt+"\n";
          com.ysp.asus.experiment_02.MainActivity.handler.sendMessage(message1);
          if(true)
            break;
        }
//        CloseSocket(client);
      }
    }catch (IOException e){

    }
  }
  private Handler mHandler = new Handler(){
    public void handleMessage(Message msg) {

    };
  };
  public ServerSocket server=null;
  private  int PORT =5000;
  private BufferedWriter writer;
  private BufferedReader reader;

  public void createSocket() throws IOException{
    server=new ServerSocket(PORT,100);
  }

  public Socket ResponseSocket() throws IOException{
    Socket client =server.accept();
    return client;
  }

  public void CloseSocket(Socket socket) throws IOException{
    reader.close();
    socket.close();
    server.close();
  }

  public void sendMsg(Socket socket,String string)throws IOException{
    writer=new BufferedWriter(
        new OutputStreamWriter(socket.getOutputStream())
    );
    writer.write("msg"+string);
    writer.flush();
  }

  public String ReceiveMsg(Socket socket) throws IOException{
    reader=new BufferedReader(
        new InputStreamReader(socket.getInputStream())
    );
        String txt ="对方:"+reader.readLine();
    return txt;
  }

}

MainActivity类

package com.ysp.asus.experiment_02;

import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.text.ClipboardManager;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;

import java.io.IOException;
import java.net.Socket;

import static com.ysp.asus.experiment_02.R.id.receiveMessage;

public class MainActivity extends AppCompatActivity {
  final ChatServer chatServer=null;
  static String text="";
  static EditText receivemessage=null;
  final ChatClient chatClient = new ChatClient();
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
//    定义相关的变量
     receivemessage=(EditText) findViewById(receiveMessage);
    final EditText message=(EditText)findViewById(R.id.message);
    final EditText IP = (EditText)findViewById(R.id.IP);
    final Button sendmessage = (Button)findViewById(R.id.sendMessage);
    final Button myIP =(Button) findViewById(R.id.myIP);
//    获取wifi下的IP地址并显示
    //获取wifi服务
    WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    //判断wifi是否开启
    if (!wifiManager.isWifiEnabled()) {
      wifiManager.setWifiEnabled(true);
    }
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    int ipAddress = wifiInfo.getIpAddress();
    String ip = intToIp(ipAddress);
    myIP.setText(ip);

//   点击实现复制内容到粘贴板
    myIP.setClickable(true);
    myIP.setOnClickListener(new Button.OnClickListener() {
      public void onClick(View arg0) {
        ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        // 将文本内容放到系统剪贴板里。
        cm.setText(myIP.getText().toString());

      }
    });


//    初始化看是服务器
    try{
      ChatServer chatServer=new ChatServer();
      chatServer.start();
    }catch(IOException e){
      Log.e("错误","开启服务器失败");
      e.printStackTrace();
    }
//    点击按钮发送数据给相应的IP地址
    sendmessage.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        HideKeyboard(sendmessage);
        new Thread(new Runnable() {
          @Override
          public void run() {

            try {
              Socket socket=chatClient.requestSocket(IP.getText().toString());
              chatClient.sendMsg(socket,message.getText().toString());
              Message message1 = new Message();
              message1.obj ="自己: "+message.getText().toString()+"\n";
              handler.sendMessage(message1);
            }catch (IOException e){
              Log.e("错误","发送失败");
            }
          }
        }).start();

      }
    });
  }
  public static Handler handler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
      super.handleMessage(msg);
      Log.i("信息","其他线程发过来:"+msg);
      text+=msg.obj.toString();
      receivemessage.setText(text);
      receivemessage.setSelection(receivemessage.getText().length(), receivemessage.getText().length());
    }
  };
//  用于将结果以IP的形式放出
  private String intToIp(int i) {

    return (i & 0xFF ) + "." +
        ((i >> 8 ) & 0xFF) + "." +
        ((i >> 16 ) & 0xFF) + "." +
        ( i >> 24 & 0xFF) ;
  }
  //隐藏虚拟键盘
  public static void HideKeyboard(View v)
  {
    InputMethodManager imm = ( InputMethodManager ) v.getContext( ).getSystemService( Context.INPUT_METHOD_SERVICE );
    if ( imm.isActive( ) ) {
      imm.hideSoftInputFromWindow( v.getApplicationWindowToken( ) , 0 );

    }
  }


}

效果展示

 

demo示例下载:http://pan.baidu.com/s/1hr2OiZq

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文是关于自学Android的笔记,包括查看类的源码的方法,活动注册的必要性以及布局练习的重要性。通过学习本文,读者可以了解到在自学Android过程中的一些关键点和注意事项。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • Unity3D引擎的体系结构和功能详解
    本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]
author-avatar
星寴
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有