Java实现app接口和Socket消息传递(11)获取在线用户列表
来源:互联网 发布:巨灵数据库β系数 编辑:程序博客网 时间:2024/06/10 03:31
原创:http://blog.csdn.net/iwanghang
其实,一般的App来说学到这里,足够应付一般的接口了。
但是,我们目标是除了接口还有Socket通讯,所以。。。路漫漫啊。。。。
1.先看一下App端的GIF效果
2.为了方便测试,我们手动修改一下数据库
把一部分id改成online为1
2.我们增加了一个接口
用于App端获取在线用户
package com.iwanghang.servletDemo;import java.io.IOException;import java.io.PrintWriter;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.logging.Level;import java.util.logging.Logger;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class UserOnline implements Servlet{private String date; // 返回的Json数据public UserOnline() {System.out.println("HelloServlet...");}@Overridepublic void destroy() {System.out.println("destroy...");}@Overridepublic ServletConfig getServletConfig() {System.out.println("getServletConfig...");return null;}@Overridepublic String getServletInfo() {System.out.println("getServletInfo...");return null;}@Overridepublic void init(ServletConfig arg0) throws ServletException {System.out.println("init...");}@Overridepublic void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {System.out.println("service...");/** * 查询在线用户username的sql语句如下 * select * from aaa_user where `online` = '1' * select * from aaa_user where online = '1' * select username from aaa_user where online = '1' * 我们用最后一个 */ try { Class.forName("com.mysql.jdbc.Driver");//创建驱动器 // 写法1. 这样写会有警告,但是不影响使用 // Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql","root","123456");//这是数据库的路径,并且还有输入账号(一般默认是root),密码之前创建用户时的那个 // 写法2. 看起来比较复杂,但是没有警告 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo1113?useUnicode=true&characterEncoding=utf-8&useSSL=false","root", "123456"); PreparedStatement pst = con.prepareCall("select username from aaa_user where online = '1'");//输入的是要在MySQL中执行的代码 ResultSet rs = pst.executeQuery();//获得执行上面代码后的结果集 date = "["; while(rs.next()){ String username = rs.getString("username"); System.out.println("username = " + username); date = date + "{\"username\":\"" + username+"\"},"; } date = date.substring(0, date.length()-1); // 截取字符串,从第1个字符串开始,截取至,倒数第2个。也就是,去掉最后一个"," date = date + "]"; } catch (ClassNotFoundException ex) { Logger.getLogger(UserOnline.class.getName()).log(Level.SEVERE, null, ex); } catch (SQLException ex) { Logger.getLogger(UserOnline.class.getName()).log(Level.SEVERE, null, ex); } // 如果date长度小于3,可以认为没有数据,给date赋值no,告诉App没有数据 if (date.length()<3) { //System.out.println("date.length() = " + date.length()); date = "no"; } System.out.println("date = " + date); response.setCharacterEncoding("UTF-8");response.setContentType("application/json; charset=utf-8");String jsonStr = date;PrintWriter out = null;try { out = response.getWriter(); out.write(jsonStr);} catch (IOException e) { e.printStackTrace();} finally { if (out != null) { out.close(); }}}}
同时,不要忘记在web.xml里做映射
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <!-- Servlet 配置 --> <servlet><!-- Servlet 注册的名字 --><servlet-name>test01</servlet-name><!-- Servlet 全类名 --><servlet-class>com.iwanghang.servletDemo.Test01</servlet-class><!-- Servlet 创建邮件级别 0为最先创建 --><load-on-startup>1</load-on-startup> </servlet> <!-- Servlet 映射 --> <servlet-mapping><!-- 映射 配置中一个同名节点 --><servlet-name>test01</servlet-name><!-- 映射 具体的访问路径 --><url-pattern>/test01</url-pattern> </servlet-mapping> <!-- Servlet 配置 --> <servlet><!-- Servlet 注册的名字 --><servlet-name>useronline</servlet-name><!-- Servlet 全类名 --><servlet-class>com.iwanghang.servletDemo.UserOnline</servlet-class><!-- Servlet 创建邮件级别 0为最先创建 --><load-on-startup>1</load-on-startup> </servlet> <!-- Servlet 映射 --> <servlet-mapping><!-- 映射 配置中一个同名节点 --><servlet-name>useronline</servlet-name><!-- 映射 具体的访问路径 --><url-pattern>/useronline</url-pattern> </servlet-mapping></web-app>
3.接下来,我们看一看App端的几个Activity
MainActivity:
package com.iwanghang.demo1114;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import com.android.volley.AuthFailureError;import com.android.volley.Request;import com.android.volley.RequestQueue;import com.android.volley.Response;import com.android.volley.VolleyError;import com.android.volley.toolbox.StringRequest;import com.android.volley.toolbox.Volley;import org.json.JSONException;import org.json.JSONObject;import java.util.HashMap;import java.util.Map;import static com.iwanghang.demo1114.Constant.LOGINCHECK;public class MainActivity extends Activity { private String TAG = "MainActivity"; // 创建请求队列 RequestQueue requestQueue = null; private EditText et_username; private EditText et_password; private Button bt_login; private TextView tv_log; private String username; private String password; private String islogin; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); requestQueue = Volley.newRequestQueue(this); et_username = findViewById(R.id.et_username); et_password = findViewById(R.id.et_password); bt_login = findViewById(R.id.bt_login); tv_log = findViewById(R.id.tv_log); initLogin(); // 登录 按钮点击事件监听 } /** * 登录 按钮点击事件监听 */ private void initLogin() { bt_login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 获取输入账号密码 username = et_username.getText().toString(); password = et_password.getText().toString(); Log.v(TAG, " username = " + username); netLogin(); // 发送网络请求 } }); } /** * 发送网络请求 尝试登陆 */ private void netLogin() { // 请求地址 //String url = "hhttp://192.168.1.129:8080/servletDemo/test01"; StringRequest request = new StringRequest(Request.Method.POST, LOGINCHECK, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.v(TAG,"response = " + response);// 返回结果 try { if (response.equals("no")){ Toast.makeText(MainActivity.this, "登录失败,请检查ID是否正确", Toast.LENGTH_SHORT).show(); }else { JSONObject object1 = new JSONObject(response); islogin = object1.getString("islogin"); // islogin Log.e("TAG", "islogin = " + islogin); Toast.makeText(MainActivity.this, "islogin = " + islogin, Toast.LENGTH_SHORT).show(); if (islogin.equals("yes")){ tv_log.setText("登录成功"); goListActivity(username); // 跳转到 在线 且 不在会话中 的用户列表 Activity }else if (islogin.equals("no")) { tv_log.setText("登录失败"); } } } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.v(TAG,"error = " + error); // 错误结果 Toast.makeText(getApplication(),"网络出问题",Toast.LENGTH_SHORT).show(); } }){ @Override protected Map<String, String> getParams() throws AuthFailureError { // 请求的内容 Map<String,String> params = new HashMap<>(); params.put("username",username); params.put("password",password); return params; } }; // 添加到请求队列 requestQueue.add(request); } /** * 跳转到 在线 且 不在会话中 的用户列表 Activity */ private void goListActivity(String username) { Intent intent = new Intent(MainActivity.this, ListActivity.class); intent.putExtra("username",username); // 姓名 startActivity(intent); }}
ListActivity:
package com.iwanghang.demo1114;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import com.android.volley.AuthFailureError;import com.android.volley.Request;import com.android.volley.RequestQueue;import com.android.volley.Response;import com.android.volley.VolleyError;import com.android.volley.toolbox.StringRequest;import com.android.volley.toolbox.Volley;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import static com.iwanghang.demo1114.Constant.USERLIST;public class ListActivity extends Activity { private String TAG = "ListActivity"; // 创建请求队列 RequestQueue requestQueue = null; private TextView tv_name; private Button bt_getList; private String username; private String usernameArray; private ListAdapter adapter; private ListView lv_main; private ArrayList<String> list = new ArrayList<String>(); private String clickName = "noData"; // 获取点击的字符串 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list); requestQueue = Volley.newRequestQueue(this); // 接过来传递的值 Bundle extras = getIntent().getExtras(); username = extras.getString("username"); tv_name = findViewById(R.id.tv_name); tv_name.setText(username); bt_getList = findViewById(R.id.bt_getList); initList(); // 获取 在线 且 不在会话中 的用户列表 按钮点击事件监听 lv_main = findViewById(R.id.lv_main); adapter = new ListAdapter(); } /** * 获取 在线 且 不在会话中 的用户列表 按钮点击事件监听 */ private void initList() { bt_getList.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getList(); // 发送网络请求 } }); } /** * 获取 在线 且 不在会话中 的用户列表 */ private void getList() { // 请求地址 //String url = "http://192.168.1.111:8001/app_new/user_sc.asp"; StringRequest request = new StringRequest(Request.Method.POST, USERLIST, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.v(TAG,"response = " + response);// 返回结果 try { if (response.equals("no")){ Toast.makeText(ListActivity.this, "登录失败,请检查ID是否正确", Toast.LENGTH_SHORT).show(); }else { JSONArray jsonArray = new JSONArray(response.toString()); Toast.makeText(ListActivity.this, "response.jsonArray.toString() = " + jsonArray, Toast.LENGTH_SHORT).show(); usernameArray = ""; for(int i=0;i<jsonArray.length();i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); Log.e("TAG", jsonObject.getString("username")); String username = jsonObject.getString("username"); if (usernameArray == "") { usernameArray = usernameArray + username; }else{ usernameArray = usernameArray +"," + username; } } Toast.makeText(ListActivity.this, "在线 且 不在会话中 的用户列表 = " + usernameArray, Toast.LENGTH_SHORT).show(); initListData(); // 初始化列表数据 } } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.v(TAG,"error = " + error); // 错误结果 Toast.makeText(getApplication(),"网络出问题",Toast.LENGTH_SHORT).show(); } }){ @Override protected Map<String, String> getParams() throws AuthFailureError { // 请求的内容 Map<String,String> params = new HashMap<>(); params.put("username",username); return params; } }; // 添加到请求队列 requestQueue.add(request); } /** * 初始化列表数据 */ private void initListData() { String temp = null; list.clear(); String[] temp_all = usernameArray.split(","); for (int i = 0 ; i <temp_all.length ; i++ ) { // 遍历数据 temp = temp_all[i]; list.add(temp); } lv_main.setAdapter(adapter); } private class ListAdapter extends BaseAdapter { private LayoutInflater mInflater; ListAdapter() { mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return list.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub System.out.println("getView " + position + " " + convertView); ListActivity.viewHolder holder = null; if (convertView == null) { convertView = mInflater.inflate(R.layout.item_list, null); holder = new viewHolder(); holder.text = convertView.findViewById(R.id.text); convertView.setTag(holder); } else { holder = (ListActivity.viewHolder) convertView.getTag(); } Log.v(TAG,""+ list.get(position)); holder.text.setText(list.get(position)); holder.text.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { clickName = list.get(position); Log.v(TAG,"text OnClickListener = " + clickName); Toast.makeText(ListActivity.this, clickName, Toast.LENGTH_SHORT).show(); goCallActivity(username,clickName); // 跳转到 视频通话请求页面 } }); return convertView; } } /** * 使用一个类来保存Item中的元素 */ public static class viewHolder { public TextView text; } /** * 跳转到 视频通话请求页面 */ private void goCallActivity(String username,String clickName) { Intent intent = new Intent(ListActivity.this, CallActivity.class); intent.putExtra("username",username); // 姓名 intent.putExtra("clickName",clickName); // 对方 startActivity(intent); }}
CallActivity:
package com.iwanghang.demo1114;import android.app.Activity;import android.os.Bundle;import android.widget.ImageView;import android.widget.TextView;public class CallActivity extends Activity { private String TAG = "CallActivity"; private TextView tv_i; private TextView tv_u; private ImageView iv_call; private TextView tv_log; private String username; private String clickName; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_call); tv_i = findViewById(R.id.tv_i); tv_u = findViewById(R.id.tv_u); iv_call = findViewById(R.id.iv_call); tv_log = findViewById(R.id.tv_log); // 接过来传递的值 Bundle extras = getIntent().getExtras(); username = extras.getString("username"); clickName = extras.getString("clickName"); tv_i.setText(username); tv_u.setText(clickName); }}
原创:http://blog.csdn.net/iwanghang
阅读全文
0 0
- Java实现app接口和Socket消息传递(11)获取在线用户列表
- Java实现app接口和Socket消息传递(10)java连接MySQL实现App登录接口
- Java实现app接口和Socket消息传递(8)Android端测试接口
- Java实现app接口和Socket消息传递(5)Java连接MySQL
- Java实现app接口和Socket消息传递(6)servlet映射并返回Json数据
- Java实现app接口和Socket消息传递(7)eclipse-workspace发布到webapps
- Java实现app接口和Socket消息传递(9)navicat创建user表
- Java实现app接口和Socket消息传递(1)Win10安装Tomcat9
- 使用redis实现获取在线用户列表
- 获取用户在线列表
- red5获取在线用户列表
- 使用Application和SessionID实现在线用户列表统计
- 使用protobuf和socket实现服务器间消息的传递
- java消息获取接口:
- 获取iphone用户安装的app列表
- 获取iphone用户安装的app列表
- [原创]jsp实现在线用户列表方法
- FMS在线用户列表的实现
- @NotNull和@NotEmpty和@NotBlank区别
- Bitmap转换成Base64
- OKHttp
- 画笔线帽 LineCap
- 八大排序算法之插入排序
- Java实现app接口和Socket消息传递(11)获取在线用户列表
- 2017年UI、Web、微服务顶级框架都有啥?不看就落伍了1
- MySQL必知必会(一)
- 双端队列,以顺序表实现双端队列,在队头和队尾添加删除元素
- 啦1
- 使用cxf开发webservice
- 讲给Android程序员看的前端教程(35)——事件处理机制
- Android RecyclerView 顶部悬浮实现
- mybatis批量插入数据List<String>