android java websocket client_websocket服务端,android客户端示例
服务端库依赖详见章末
#####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客户端示例相关推荐
- 使用HTML5的WebSocket实现服务端和客户端数据通信(有演示和源码)
WebSocket协议是基于TCP的一种新的网络协议.WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术.依靠这种技术可以实现客户端和服务器端的长连接,双向实时通信. ...
- android binder - 客户端(c++层) 调用 服务端(java层),服务端回调客户端 例子
学习了: android binder - 客户端(java层) 调用 服务端(c++层) 例子 http://blog.csdn.net/ganyue803/article/details/4131 ...
- springboot+websocket实现服务端、客户端
一.引言 小编最近一直在使用springboot框架开发项目,毕竟现在很多公司都在采用此框架,之后小编也会陆续写关于springboot开发常用功能的文章. 什么场景下会要使用到websocket的呢 ...
- java BIO tcp服务端向客户端消息群发代码教程实战
前言 项目需要和第三方厂商的服务需要用TCP协议通讯,考虑到彼此双方可能都会有断网重连.宕机重启的情况,需要保证 发生上述情况后,服务之间能够自动实现重新通信.研究测试之后整理如下代码实现.因为发现客 ...
- 使用WebSocket实现服务端和客户端的通信
开发中经常会有这样的使用场景.如某个用户在一个数据上做了xx操作, 与该数据相关的用户在线上的话,需要实时接收到一条信息. 这种可以使用WebSocket来实现. 另外,对于消息,可以定义一个类进行固 ...
- 单点登录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 ...
- libevent的两个服务端、客户端示例(C语言)
目录 示例1 server.c client.c makefile 示例2:使用BufferEvent server.c client.c makefile 关于libevent的介绍,请参见< ...
- Java Websocket实例【服务端与客户端实现全双工通讯】
Java Websocket实例[服务端与客户端实现全双工通讯] 现很多网站为了实现即时通讯,所用的技术都是轮询(polling).轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP ...
- Android:在同一WiFi下通讯(局域网下服务端和客户端通讯)
看了几天的Android WiFi通讯,总结一下,并附相关Demo(也是仿网上做的),建议收藏 两台设备(手机与手机,手机与硬件都一样)在同一WiFi下通讯,用的是TCP/IP协议,那我们应如 ...
最新文章
- 中国大陆集成电路芯片领域各个细分代表企业
- matlba 正交基
- Java代码在计算机中的三个阶段与反射
- Visual Studio Code里关于ESLint的错误消息
- ASP.NET MVC 重点教程一周年版 第八回 Helper之演化
- [JavaScript]使用document.createDocumentFragment优化性能
- existed hive ods_hive数据仓库建设
- DAY24:信息搜集
- 金山词霸2005开启后导致桌面刷新的问题
- gbk与gb2312的区别是什么?
- java小写金额转大写金额_java转换小写金额为大写金额
- linux系统可以安装企业微信,Linux 上安装微信客户端
- 计算机英语听力,每日英语听力pc版
- 计算机基础长文档的排版,大学计算机基础中Word长文档排版的教学思考
- python-电脑时间校准
- 计算机数字信号和模拟信号,模拟信号和数字信号有什么区别
- 用键盘控制鼠标移动的Python脚本
- 多功能Python键盘记录工具Radium
- 使用VB.Net操作Excel输出重复内容的表格
- 色彩还原测试—imatest