android客户端在多个界面切换时保持socket的链接的实例

鉴于自己的痛苦,研究一个socket在多个界面切换时保持链接的问题,令我纠结很久,现在我提供客户端的源码给有需要的人参考。

1、ApplicationUtil类:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;import android.app.Application;public class ApplicationUtil extends Application{private Socket socket;private DataOutputStream out = null;private DataInputStream in = null;public void init() throws IOException, Exception{this.socket = new Socket("192.168.1.104",10202);this.out = new DataOutputStream(socket.getOutputStream());this.in = new DataInputStream(socket.getInputStream());}public Socket getSocket() {return socket;}public void setSocket(Socket socket) {this.socket = socket;}public DataOutputStream getOut() {return out;}public void setOut(DataOutputStream out) {this.out = out;}public DataInputStream getIn() {return in;}public void setIn(DataInputStream in) {this.in = in;}}

AndroidMainifest.xml中application的配置:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.login"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="10"android:targetSdkVersion="15" /><applicationandroid:name="com.util.ApplicationUtil"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".LoginActivity"android:label="@string/title_activity_main" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".MainActivity"/></application><!-- 振动需要的权限 --><uses-permission android:name="android.permission.VIBRATE"/><!-- 声明网络权限 --><uses-permission android:name="android.permission.INTERNET"/>
</manifest>

2、LoginActivity类:

import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;import com.login.R;
import com.util.ApplicationUtil;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;public class LoginActivity extends Activity{private EditText usernameT;private EditText passwordT;private Button loginButton;private Socket socket;private DataOutputStream out;private DataInputStream in;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.login);usernameT = (EditText) findViewById(R.id.username);passwordT = (EditText) findViewById(R.id.password);loginButton = (Button) findViewById(R.id.login);loginButton.setOnClickListener(new OnClickListener(){public void onClick(View v) {ApplicationUtil appUtil =  (ApplicationUtil) LoginActivity.this.getApplication();try {appUtil.init();Socket socket = appUtil.getSocket();out = appUtil.getOut();in = appUtil.getIn();} catch (IOException e1) {e1.printStackTrace();} catch (Exception e1) {e1.printStackTrace();}String username = usernameT.getText().toString();String password = passwordT.getText().toString();MD5 md5 = new MD5();String ss = md5.MD5(username+"|"+password);try {//发送数据String str = "[login]|"+ss;out.writeBytes(str);out.flush();System.out.println("str ===> "+str);//创建一个缓冲字节数int r = in.available();  while(r==0){  r = in.available();  }  byte[] b = new byte[r];in.read(b);String result = new String(b,"utf-8");System.out.println("result = "+result);if(result.equals("登陆成功0")){Intent intent = new Intent();intent.setClass(LoginActivity.this, MainActivity.class);startActivity(intent);}else{Intent intent = new Intent();intent.setClass(LoginActivity.this, MainActivity.class);startActivity(intent);}} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}});}
}

3、MainActivity类:

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;import com.image.TestActivity;
import com.login.R;
import com.util.ApplicationUtil;import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.provider.MediaStore.Audio;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;public class MainActivity extends Activity {private EditText mess; private Socket socket;private Handler handler;private DataInputStream in;private NotificationManager nm;  private Notification n;  private int messageNotificationID = 0;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.success);mess = (EditText) findViewById(R.id.message);ApplicationUtil appUtil = (ApplicationUtil) MainActivity.this.getApplication();socket = appUtil.getSocket();in = appUtil.getIn();handler = new Handler(){@Overridepublic void handleMessage(Message msg) {//如果来自子线程if(msg.what == 0x123){mess.append(msg.obj.toString()+"\n");//消息通知
                    mynoti();}}};//调用线程
        myThread();}//JAVA可以设置读写缓冲区的大小-setReceiveBufferSize(int size), setSendBufferSize(int size)。public void myThread(){Thread oneThread = new Thread(new Runnable(){public boolean isRunning = true;public void run() {     while(isRunning){try {Thread.sleep(1000);//创建一个缓冲字节数int r = in.available();while(r==0){  r = in.available();  }byte[] b = new byte[r];in.read(b);String content = new String(b,"utf-8");//每当读到来自服务器的数据后,发送消息通知程序页面显示数据  Message msg = new Message();msg.what = 0x123;msg.obj = content;Log.v("ho", content);handler.sendMessage(msg);} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();} }}});oneThread.start();}public void mynoti(){NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);// 创建一个通知  Notification mNotification = new Notification();  //用系统自带的铃声mNotification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6"); // mNotification.sound = Uri.parse("file:///sdcard/wen.mp3");//mNotification.defaults=Notification.DEFAULT_SOUND;  //Notification.FLAG_INSISTENT;      //让声音、振动无限循环,直到用户响应//Notification.FLAG_AUTO_CANCEL;    //通知被点击后,自动消失//Notification.FLAG_NO_CLEAR;  //点击'Clear'时,不清楚该通知(QQ的通知无法清除,就是用的这个)mNotification.flags = Notification.FLAG_NO_CLEAR; ;  //通知时发出的振动  //第一个参数: 振动前等待的时间  //第二个参数: 第一次振动的时长、以此类推  long[] vir = {0,100,200,300};  mNotification.vibrate = vir;  mNotificationManager.notify(messageNotificationID, mNotification);messageNotificationID++;}
}

4、MD5类:

import java.security.MessageDigest;public class MD5 {// MD5加码。32位     public static String MD5(String inStr) {     MessageDigest md5 = null;     try {     md5 = MessageDigest.getInstance("MD5");     } catch (Exception e) {     System.out.println(e.toString());     e.printStackTrace();     return "";     }     char[] charArray = inStr.toCharArray();     byte[] byteArray = new byte[charArray.length];     for (int i = 0; i < charArray.length; i++)     byteArray[i] = (byte) charArray[i];     byte[] md5Bytes = md5.digest(byteArray);     StringBuffer hexValue = new StringBuffer();     for (int i = 0; i < md5Bytes.length; i++) {     int val = ((int) md5Bytes[i]) & 0xff;     if (val < 16)     hexValue.append("0");     hexValue.append(Integer.toHexString(val));     }         return hexValue.toString();     }     
}

6、login.xml和success.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" android:orientation="vertical"><TableLayout android:layout_width="fill_parent"android:layout_height="wrap_content"><TableRow><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="账号:"/><EditTextandroid:id="@+id/username"android:layout_width="200dp"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:layout_marginTop="10dp"android:layout_marginRight="10dp"android:hint="账号"/></TableRow> <TableRow><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="密码:"/><EditTextandroid:id="@+id/password"android:password="true"android:layout_width="200dp"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:layout_marginTop="10dp"android:layout_marginRight="10dp"android:hint="密码"/></TableRow>  </TableLayout><Buttonandroid:id="@+id/login"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:layout_marginTop="10dp"android:layout_marginRight="10dp"android:text="登录"/></LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" android:orientation="vertical"><TextView android:id="@+id/success"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="不断接受信息,并提示"/><EditText android:id="@+id/message"android:layout_width="fill_parent"android:layout_height="wrap_content"android:cursorVisible="false"/></LinearLayout>

以上都是客户端,服务端就自己写,socket代码差不多。

转载于:https://www.cnblogs.com/dennytao/p/5351868.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

六、封装 MyBatis 输出结果resultType、resultMap 以及 数据库表中列名和返回对象属性名不一致的2种解决方案(详解)

1.1 resultType resultType: 执行 sql 得到 ResultSet 转换的类型&#xff0c;使用类型的完全限定名或别名。 注意&#xff1a;如果返回的是集合&#xff0c;那应该设置为集合包含的类型&#xff0c;而不是集合本身。resultType 和 resultMap&#xff0c;不能同时使用。 A、…

API 接口批量测试

ApiPost 创建接口 导入要测试的数据 测试结果 ApiFox 创建接口 导入接口 导入测试数据&#xff0c;可以直接编辑&#xff0c;粘贴进来 测试结果

LeetCode 2342. 数位和相等数对的最大和

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的数组 nums &#xff0c;数组中的元素都是 正 整数。请你选出两个下标 i 和 j&#xff08;i ! j&#xff09;&#xff0c;且 nums[i] 的数位和 与 nums[j] 的数位和相等。 请你找出所有满足条件的下标 i 和 j &#xff…

软件项目管理-构建之法-四周总结

写在前面 课程名&#xff1a;软件项目管理 授课人&#xff1a;东北师范大学 杨贵福&#xff08; http://www.cnblogs.com/younggift/&#xff09; 教材&#xff1a;《构建之法 - 现代软件工程》 作者&#xff1a;邹欣老师 &#xff08;博客&#xff1a;http://www.cnblogs.com…

一、Vue基础语法学习笔记系列——插值操作(Mustache语法、v-once、v-html、v-text、v-pre、v-cloak)、绑定属性v-bind(绑定class、style)、计算属性

一、插值操作 1. Mustache 如何将data中的文本数据&#xff0c;插入到HTML中呢&#xff1f; 我们已经学习过了&#xff0c;可以通过Mustache语法(也就是双大括号)。 Mustache: 胡子/胡须. 我们可以像下面这样来使用&#xff0c;并且数据是响应式的 2. v-once 但是&#xff0…

LeetCode 2348. 全 0 子数组的数目

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums &#xff0c;返回全部为 0 的 子数组 数目。 子数组 是一个数组中一段连续非空元素组成的序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,0,0,2,0,0,4] 输出&#xff1a;6 解释&#xff1a; 子数组 [0] 出现了…

二、Vue基础语法学习笔记——事件监听v-on、条件判断(v-if、v-else-if、v-else、v-show)、循环遍历(v-for遍历数组对象,key属性、检测数组更新)、图书案例、双向绑定

四、事件监听 在前端开发中&#xff0c;我们需要经常和用于交互。 这个时候&#xff0c;我们就必须监听用户发生的时间&#xff0c;比如点击、拖拽、键盘事件等等 在Vue中如何监听事件呢&#xff1f;使用v-on指令 v-on介绍 作用&#xff1a;绑定事件监听器 缩写&#xff1a; 预…

HDU4859 海岸线(最小割)

题目大概就是说一个n*m的地图&#xff0c;地图上每一块是陆地或浅海域或深海域&#xff0c;可以填充若干个浅海域使其变为陆地&#xff0c;问能得到的最长的陆地海岸线是多少。 也是很有意思的一道题。 一开始想歪了&#xff0c;想着&#xff0c;不考虑海岸线重合的情况那海岸线…

LeetCode 2352. 相等行列对

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid &#xff0c;返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。 如果行和列以相同的顺序包含相同的元素&#xff08;即相等的数组&#xff09;&#xff0c;则认为二者是相等的。 示…

JAVA电话本系统

package com.sunhang.phonebook; import java.text.ParseException;import java.util.ArrayList;import java.util.List;import java.util.Scanner; public class PhoneBook { //存放联系人的容器 List<Contacts> list new ArrayList<Contacts>(); /** * 增加联系…

三、Vue组件化开发学习笔记——组件化的基本步骤、全局组件和局部组件、父组件和子组件、注册组件的语法糖、模板分离写法、组件的数据存放

一、什么是组件化&#xff1f; 人面对复杂问题的处理方式&#xff1a; 任何一个人处理信息的逻辑能力都是有限的 所以&#xff0c;当面对一个非常复杂的问题时&#xff0c;我们不太可能一次性搞定一大堆的内容。 但是&#xff0c;我们人有一种天生的能力&#xff0c;就是将问题…

LeetCode 2353. 设计食物评分系统(sortedcontainers)

文章目录1. 题目2. 解题1. 题目 设计一个支持下述操作的食物评分系统&#xff1a; 修改 系统中列出的某种食物的评分。返回系统中某一类烹饪方式下评分最高的食物。 实现 FoodRatings 类&#xff1a; FoodRatings(String[] foods, String[] cuisines, int[] ratings) 初始化…

四、Vue组件化开发学习笔记——父子组件通信,父级向子级传值(props),子级向父级传值(自定义事件),slot插槽

一、父子组件的通信 在上一篇博文中&#xff0c;我们提到了子组件是不能引用父组件或者Vue实例的数据的。 但是&#xff0c;在开发中&#xff0c;往往一些数据确实需要从上层传递到下层&#xff1a; 比如在一个页面中&#xff0c;我们从服务器请求到了很多的数据。其中一部分数…

LeetCode 2336. 无限集中的最小数字(SortedSet)

文章目录1. 题目2. 解题1. 题目 现有一个包含所有正整数的集合 [1, 2, 3, 4, 5, …] 。 实现 SmallestInfiniteSet 类&#xff1a; SmallestInfiniteSet() 初始化 SmallestInfiniteSet 对象以包含 所有 正整数。int popSmallest() 移除 并返回该无限集中的最小整数。void ad…

C# - 类_使用新成员隐藏基类成员

1 using System;2 3 namespace 类_使用新成员隐藏基类成员4 {5 // 基类 : Animal6 public class Animal7 {8 // 基类的普通方法Eat(), 并未用Virtual修饰9 public void Eat() 10 { 11 Console.WriteLine("动物吃的方法: …

五、Vue模块化开发学习笔记——JavaScript原始功能、匿名函数的解决方案、使用模块作为出口、CommonJS、ES6 export和import的使用

一、JavaScript原始功能 -在网页开发的早期&#xff0c;js制作作为一种脚本语言&#xff0c;做一些简单的表单验证或动画实现等&#xff0c;那个时候代码还是很少的。 那个时候的代码是怎么写的呢&#xff1f; 直接将代码写在<script>标签中即可 随着ajax异步请求的出现&…

LeetCode 2333. 最小差值平方和(贪心)

文章目录1. 题目2. 解题1. 题目 给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;长度为 n 。 数组 nums1 和 nums2 的 差值平方和 定义为所有满足 0 < i < n 的 (nums1[i] - nums2[i])^2 之和。 同时给你两个正整数 k1 和 k2 。你可以将 nums1 中的任意…

[na][tools]快速ping网段工具-QuickPing

一款神器 quickping 能够很快的探测出该网断分出去哪些地址. 在线的会显示绿色 在线的有主机名的显示为亮绿色 转载于:https://www.cnblogs.com/iiiiher/p/5362403.html

六、Webpack详解学习笔记——webpack的安装、起步、配置、loader的使用、webpack中配置Vue、plugin的使用、搭建本地服务器、webpack配置的分离

一、认识webpack 什么是webpack&#xff1f; 这个webpack还真不是一两句话可以说清楚的。我们先看看官方的解释&#xff1a; At its core, webpack is a static module bundler for modern JavaScript applications.从本质上来讲&#xff0c;webpack是一个现代的JavaScript应用…

DOM getElementById

This is a header click the header 转载于:https://www.cnblogs.com/vector11248/p/5363447.html