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;

}

}

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

d2719f0aa8171f19022f79f14962c424.png

#####客户端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);

}

}

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

811c2acbf7f0c0537998d7dae407c2ee.png

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

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

844a2fc23ec75c112ebba97bec4a0cd6.png

服务端推送信息成功

服务端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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值