服务端库依赖详见章末

#####spring websocket服务端代码(会话过程)

public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor {

private static final Logger logger = LoggerFactory.getLogger(HandshakeInterceptor.class);

//会话开始

@Override

public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws Exception {

attributes.put(Constant.WEBSOCKET_USERNAME,"LSH");

// 从session中获取用户

/*if (request instanceof ServletServerHttpRequest) {

ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest) request;

HttpSession session = serverHttpRequest.getServletRequest().getSession(false);

if (session!=null) {

String username = (String) session.getAttribute(Constant.SESSION_USERNAME);

attributes.put(Constant.WEBSOCKET_USERNAME,username);

}

}*/

return true;

}

//会话结束

@Override

public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {

System.out.println("After Handshake");

super.afterHandshake(request, response, wsHandler, ex);

}

}

#####服务端websocket消息处理

import com.beesgame.sanguo.constant.Constant;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.web.socket.CloseStatus;

import org.springframework.web.socket.TextMessage;

import org.springframework.web.socket.WebSocketSession;

import org.springframework.web.socket.handler.TextWebSocketHandler;

import java.io.IOException;

import java.util.ArrayList;

/**

* Created by hackway on

* Date: 2016/1/15.

* Time:11:15

*/

public class WebSocketEndPoint extends TextWebSocketHandler {

private static final ArrayList users;

private static final Logger logger;

static {

users = new ArrayList();

logger = LoggerFactory.getLogger(WebSocketEndPoint.class);

}

@Override

protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {

super.handleTextMessage(session, message);

TextMessage returnMessage = new TextMessage(message.getPayload()+" received at server");

session.sendMessage(returnMessage);

}

@Override

public void afterConnectionEstablished(WebSocketSession session) throws Exception {

logger.info("connect to the websocket success......");

//添加用户到session

users.add(session);

String username = (String) session.getAttributes().get(Constant.WEBSOCKET_USERNAME);

if (username!=null) {

session.sendMessage(new TextMessage("用户名:"+username));

}

}

@Override

public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {

if (session.isOpen()) {

session.close();

}

logger.info("websocket transport error, connection closed......");

users.remove(session);

}

@Override

public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {

logger.info("websocket connection closed......");

users.remove(session);

}

@Override

public boolean supportsPartialMessages() {

return super.supportsPartialMessages();

}

// 发送信息给特定用户(LSH)

public void sendMessageToUser(String username, TextMessage message) {

for (WebSocketSession user:users) {

if (user.getAttributes().get(Constant.WEBSOCKET_USERNAME).equals(username)) {

try {

if (user.isOpen()) {

user.sendMessage(message);

}

} catch (IOException e) {

e.printStackTrace();

}

break;

}

}

}

//发送信息给所用用户,广播

public void sendMessageToAllUser(TextMessage message) {

for (WebSocketSession user:users) {

try {

if (user.isOpen()) {

user.sendMessage(message);

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

#####使用注解配置websocket(需要在springmvc配置文件中开启相应注解支持)

@Configuration

//@EnableWebMvc

@EnableWebSocket

public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {

@Override

public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {

webSocketHandlerRegistry.addHandler(getWebSocketEndPoint(),"/websocket").addInterceptors(new HandshakeInterceptor());

webSocketHandlerRegistry.addHandler(getWebSocketEndPoint(),"/websocket/sockjs").addInterceptors(new HandshakeInterceptor()).withSockJS();

}

@Bean

public WebSocketEndPoint getWebSocketEndPoint() {

return new WebSocketEndPoint();

}

}

#####controller调用websocket发送信息

@Controller("/*")

public class IndexController extends BaseController {

@Autowired

private UserInfoService userInfoService;

//注入websocket

@Bean

public WebSocketEndPoint getWebSocketEndpoint() {

return new WebSocketEndPoint();

}

@RequestMapping(value = "socket.do", produces = "text/json;charset=UTF-8", method = RequestMethod.GET)

@ResponseBody

public String socket(@RequestParam(value = "uid") long uid) throws IOException {

UserInfoVO userToken = userInfoService.getUserInfoVOByUid(uid);

String result = objectMapper.writeValueAsString(userToken);

getWebSocketEndpoint().sendMessageToUser("LSH", new TextMessage(result));

return result;

}

}

#####服务端启动截图

#####客户端websocket链接服务端(android) java-websocket 项目地址 https://github.com/TooTallNate/Java-WebSocket

gradle中添加java-websocket依赖 ######compile 'org.java-websocket:Java-WebSocket:1.3.0'

#####websocket客户端类

import android.os.Handler;

import android.os.Message;

import android.util.Log;

import android.widget.TextView;

import org.java_websocket.client.WebSocketClient;

import org.java_websocket.drafts.Draft;

import org.java_websocket.drafts.Draft_17;

import org.java_websocket.handshake.ServerHandshake;

import java.net.URI;

import java.util.Date;

/**

* Created by hackway on 16/2/24.

*/

public class SiteWebsocket extends WebSocketClient {

//handler通知主线程更新textview

private Handler handler = new Handler() {

@Override

public void handleMessage(Message msg) {

textView.setText(String.valueOf(msg.obj));

}

};

private TextView textView;

public SiteWebsocket(URI serverUri, Draft draft, TextView tv) {

super(serverUri, draft);

this.textView = tv;

}

@Override

public void onOpen(ServerHandshake handshakedata) {

Log.d("websocket","open connection");

}

@Override

public void onMessage(String message) {

Log.d("websocket","receive: "+message);

Message msg = new Message();

msg.obj = message;

handler.sendMessage(msg);

}

@Override

public void onClose(int code, String reason, boolean remote) {

Log.d("websocket","Connection close by "+(remote?"remote peer":"us") +" at "+new Date(System.currentTimeMillis()));

}

@Override

public void onError(Exception ex) {

ex.printStackTrace();

}

}

#####客户端建立链接(MainActivity.java)

import android.os.Bundle;

import android.support.design.widget.FloatingActionButton;

import android.support.design.widget.Snackbar;

import android.support.v7.app.AppCompatActivity;

import android.support.v7.widget.Toolbar;

import android.view.View;

import android.view.Menu;

import android.view.MenuItem;

import android.widget.TextView;

import org.java_websocket.drafts.Draft_17;

import java.net.URI;

import java.net.URISyntaxException;

import site.hackway.www.androidsite.websocket.SiteWebsocket;

public class MainActivity extends AppCompatActivity {

private TextView textView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

setSupportActionBar(toolbar);

textView = (TextView) findViewById(R.id.txvw);

SiteWebsocket siteWebsocket = null;

try {

siteWebsocket = new SiteWebsocket(new URI("ws://192.168.1.103:8080/sanguo/websocket"),new Draft_17(),textView);

siteWebsocket.connectBlocking();

} catch (URISyntaxException e) {

e.printStackTrace();

} catch (InterruptedException e) {

e.printStackTrace();

}

/*FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

fab.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)

.setAction("Action", null).show();

}

});*/

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.menu_main, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// Handle action bar item clicks here. The action bar will

// automatically handle clicks on the Home/Up button, so long

// as you specify a parent activity in AndroidManifest.xml.

int id = item.getItemId();

//noinspection SimplifiableIfStatement

if (id == R.id.action_settings) {

return true;

}

return super.onOptionsItemSelected(item);

}

}

客户端代码编写完毕,启动模拟器(注意客户端服务端需处于统一局域网)

出现 用户名:LSH 说明连接成功

接着测试服务端向客户端发送消息 通过浏览器访问 http://ip:port/your project name/socket.do?uid=1

服务端推送信息成功

服务端maven依赖,(其中spring的版本需要大于4)

4.2.4.RELEASE

junit

junit

4.11

test

org.springframework

spring-context

${spring.version}

org.springframework

spring-context-support

${spring.version}

org.springframework

spring-jdbc

${spring.version}

org.springframework

spring-webmvc

${spring.version}

org.springframework

spring-aop

${spring.version}

org.springframework

spring-test

${spring.version}

org.springframework

spring-web

${spring.version}

org.springframework

spring-core

${spring.version}

org.springframework

spring-expression

${spring.version}

org.springframework

spring-websocket

${spring.version}

org.springframework

spring-messaging

${spring.version}

org.freemarker

freemarker

2.3.20

com.fasterxml.jackson.core

jackson-core

2.1.0

com.fasterxml.jackson.core

jackson-databind

2.1.0

com.fasterxml.jackson.core

jackson-annotations

2.1.0

ch.qos.logback

logback-classic

1.1.3

org.logback-extensions

logback-ext-spring

0.1.2

org.slf4j

jcl-over-slf4j

1.7.12

android java websocket client_websocket服务端,android客户端示例相关推荐

  1. 使用HTML5的WebSocket实现服务端和客户端数据通信(有演示和源码)

    WebSocket协议是基于TCP的一种新的网络协议.WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术.依靠这种技术可以实现客户端和服务器端的长连接,双向实时通信. ...

  2. android binder - 客户端(c++层) 调用 服务端(java层),服务端回调客户端 例子

    学习了: android binder - 客户端(java层) 调用 服务端(c++层) 例子 http://blog.csdn.net/ganyue803/article/details/4131 ...

  3. springboot+websocket实现服务端、客户端

    一.引言 小编最近一直在使用springboot框架开发项目,毕竟现在很多公司都在采用此框架,之后小编也会陆续写关于springboot开发常用功能的文章. 什么场景下会要使用到websocket的呢 ...

  4. java BIO tcp服务端向客户端消息群发代码教程实战

    前言 项目需要和第三方厂商的服务需要用TCP协议通讯,考虑到彼此双方可能都会有断网重连.宕机重启的情况,需要保证 发生上述情况后,服务之间能够自动实现重新通信.研究测试之后整理如下代码实现.因为发现客 ...

  5. 使用WebSocket实现服务端和客户端的通信

    开发中经常会有这样的使用场景.如某个用户在一个数据上做了xx操作, 与该数据相关的用户在线上的话,需要实时接收到一条信息. 这种可以使用WebSocket来实现. 另外,对于消息,可以定义一个类进行固 ...

  6. 单点登录cas综述之cas4.2.7服务端+cas客户端+示例程序+环境搭建说明-陈杰

    1环境搭建以及把示例程序跑起来 1.1  安装jdk1.8 1.2 下载tomcat8+cas4.2.7服务端war+cas客户端war 1.2.1下载经过配置的Tomcat8和本教程配套文件 1.2 ...

  7. libevent的两个服务端、客户端示例(C语言)

    目录 示例1 server.c client.c makefile 示例2:使用BufferEvent server.c client.c makefile 关于libevent的介绍,请参见< ...

  8. Java Websocket实例【服务端与客户端实现全双工通讯】

    Java Websocket实例[服务端与客户端实现全双工通讯] 现很多网站为了实现即时通讯,所用的技术都是轮询(polling).轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP ...

  9. Android:在同一WiFi下通讯(局域网下服务端和客户端通讯)

    ​ 看了几天的Android WiFi通讯,总结一下,并附相关Demo(也是仿网上做的),建议收藏 ​ 两台设备(手机与手机,手机与硬件都一样)在同一WiFi下通讯,用的是TCP/IP协议,那我们应如 ...

最新文章

  1. 中国大陆集成电路芯片领域各个细分代表企业
  2. matlba 正交基
  3. Java代码在计算机中的三个阶段与反射
  4. Visual Studio Code里关于ESLint的错误消息
  5. ASP.NET MVC 重点教程一周年版 第八回 Helper之演化
  6. [JavaScript]使用document.createDocumentFragment优化性能
  7. existed hive ods_hive数据仓库建设
  8. DAY24:信息搜集
  9. 金山词霸2005开启后导致桌面刷新的问题
  10. gbk与gb2312的区别是什么?
  11. java小写金额转大写金额_java转换小写金额为大写金额
  12. linux系统可以安装企业微信,Linux 上安装微信客户端
  13. 计算机英语听力,每日英语听力pc版
  14. 计算机基础长文档的排版,大学计算机基础中Word长文档排版的教学思考
  15. python-电脑时间校准
  16. 计算机数字信号和模拟信号,模拟信号和数字信号有什么区别
  17. 用键盘控制鼠标移动的Python脚本
  18. 多功能Python键盘记录工具Radium
  19. 使用VB.Net操作Excel输出重复内容的表格
  20. 色彩还原测试—imatest

热门文章

  1. 百知教育-胡鑫喆讲师-java-第一章07
  2. PCL 非线性最小二乘法拟合圆柱
  3. 根据工资计算应缴纳的党费
  4. 《JAVA编程思想》学习笔记:第21章(并发)
  5. 模仿小米安全中心的进度效果
  6. Java中一些常被忽视的特性
  7. 【愚公系列】2023年02月 WMS智能仓储系统-013.基础设置(首页、公司信息、角色设置)
  8. Facebook授权登录获取应用编号和应用密钥及配置
  9. Spine之二——认识界面
  10. cb46a_c++_STL_算法_逆转和旋转reverse_rotate_函数advance