WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。

Java服务端

import java.io.IOException;

import java.util.concurrent.CopyOnWriteArraySet;

import javax.websocket.*;

import javax.websocket.server.ServerEndpoint;

/**

* @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,

* 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端

*/

@ServerEndpoint("/websocket")

public class WebSocketTest {

//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。

private static int onlineCount = 0;

//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识

private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet();

//与某个客户端的连接会话,需要通过它来给客户端发送数据

private Session session;

/**

* 连接建立成功调用的方法

* @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据

*/

@OnOpen

public void onOpen(Session session){

this.session = session;

webSocketSet.add(this); //加入set中

addOnlineCount(); //在线数加1

System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());

}

/**

* 连接关闭调用的方法

*/

@OnClose

public void onClose(){

webSocketSet.remove(this); //从set中删除

subOnlineCount(); //在线数减1

System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());

}

/**

* 收到客户端消息后调用的方法

* @param message 客户端发送过来的消息

* @param session 可选的参数

*/

@OnMessage

public void onMessage(String message, Session session) {

System.out.println("来自客户端的消息:" + message);

//群发消息

for(WebSocketTest item: webSocketSet){

try {

item.sendMessage(message);

} catch (IOException e) {

e.printStackTrace();

continue;

}

}

}

/**

* 发生错误时调用

* @param session

* @param error

*/

@OnError

public void onError(Session session, Throwable error){

System.out.println("发生错误");

error.printStackTrace();

}

/**

* 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。

* @param message

* @throws IOException

*/

public void sendMessage(String message) throws IOException{

this.session.getBasicRemote().sendText(message);

//this.session.getAsyncRemote().sendText(message);

}

public static synchronized int getOnlineCount() {

return onlineCount;

}

public static synchronized void addOnlineCount() {

WebSocketTest.onlineCount++;

}

public static synchronized void subOnlineCount() {

WebSocketTest.onlineCount--;

}

}

Python客户端

安装依赖 pip install websocket-client

import websocket

try:

import thread

except ImportError:

import _thread as thread

import time

def on_message(ws, message):

print(message)

def on_error(ws, error):

print(error)

def on_close(ws):

print("### closed ###")

def on_open(ws):

def run(*args):

for i in range(3):

time.sleep(1)

ws.send("Hello %d" % i)

time.sleep(1)

ws.close()

print("thread terminating...")

thread.start_new_thread(run, ())

if __name__ == "__main__":

websocket.enableTrace(True)

ws = websocket.WebSocketApp("ws://127.0.0.1:8080/websocket",

on_message = on_message,

on_error = on_error,

on_close = on_close)

ws.on_open = on_open

ws.run_forever()

python java web_Python 与 Java 使用 websocket 通信相关推荐

  1. python websocket_python 模拟websocket通信

    以前,很多网站使用轮询实现推送技术.轮询是在特定的的时间间隔(比如1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给浏览器.轮询的缺点很明显,浏览器需要不断的向服务器发 ...

  2. 学python和java哪个难?,java和python哪个难学

    java和python哪个好学 ①python比Java简单,学习成本低,开发效率高;②Java运行效率高于python,尤其是纯python开发的程序,效率极低;③Java相关资料多,尤其是中文资料 ...

  3. java/web/springboot项目使用WebSocket消息推送

    java/web/springboot项目使用WebSocket消息推送 最近项目中,有消息推送的广播和在线咨询的功能,以前也没搞过啊,有些小伙伴估计也是,那肯定要赶紧学习起来啊~ 不说废话,今天就告 ...

  4. php和python和java-python与java区别

    Python和Java都是很火的编程语言,对于想学习编程的人员来说,常常被这个问题所困扰:我是该学Python还是Java呢?想要解决这个问题,还需结合自身实际情况和两种语言的特点进行分析. 以下是P ...

  5. java和python工资-python为什么叫爬虫 python工资高还是java的高

    人工智能的现世,让python学习成风,由于其发展前景好,薪资高,一时成为众多语言的首选.Python是一门非常适合开发网络爬虫的编程语言,十分的简洁方便所以是网络爬虫首选编程语言!不少新手常问pyt ...

  6. python程序员薪资-python工资高还是java?

    说起来,随着人工智能和大数据逐渐进入人们的眼中,越来越多的人看到互联网未来大好发展趋势,而想要学习一门技术来进入其中,以期分一杯羹.但是,作为人工智能和大数据的重要编程语言,Python和Java,该 ...

  7. php和python和java-python和java,php,c,c#,c++的对比

    1.C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言.C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素.C++在这方面做了改进,在保 ...

  8. python真的超过java了吗-JAVA会被Python超越成为世界上第一大编程语言吗?

    关键时刻,第一时间送达! 这个路还还长,暂时不会,未来5年不会,10年有可能,就看现在小学生.初中生学习的怎么样.最近,也在观注这方面的,偶尔看到新闻说python纳入到高考中,想想如果真纳入了,过4 ...

  9. java面试题44关于 Socket 通信编程,以下描述正确的是:( )

    java面试题44关于 Socket 通信编程,以下描述正确的是:( ) A 客户端通过new ServerSocket()创建TCP连接对象 B 客户端通过TCP连接对象调用accept()方法创建 ...

最新文章

  1. 倒计时两天丨NeurIPS 2020预讲会:7位智源青年科学家,21场报告
  2. python白名单验证-python脚本简单检测ip合法性并添加到白名单文件
  3. php固定空格,使用php校对(固定标点符号,空格,大写字母)生物页面文本
  4. antd 能自适应吗_自首要满足的条件有哪些,自首能从宽处罚吗?
  5. 【编撰】HDS, HLS,HLS-ABR, HSS — Adaptive HTTP Streaming Demystified
  6. day10【过渡】分布式理论
  7. Win7原版|MSDN Windows7 SP1官方原版ISO镜像下载(全版本)
  8. NRF24L01入门总结
  9. Cisco(思科)无线路由器
  10. SpringBoot中使用MyBatis-Plus是如何解决Invalid bound statement (not found)这个异常的
  11. 艺多不压身 -- 目录
  12. 推荐几款电脑测试软件
  13. 任务栏中间的活动窗口图标不见了怎么办
  14. 应对羊毛党的老手段不管用了,但有些公司依然有办法,他们是怎么做的?
  15. sed删除代码空行和删去行尾空白
  16. 代谢组学分析常用网站
  17. linux里gdb配置插件peda, gef, gdbinit
  18. Flask扩展包安装出现错误:Could not find a version that satisfies the requirement ...
  19. 磁学基础 永久磁铁的磁力线分布
  20. [BC#89B]Fxx and game

热门文章

  1. 在CentOS 6.3 64bit上如何从源码生成rpm包?
  2. VOLTE parameter in Attach Request/Accept message
  3. Go 分布式学习利器(10)-- Go语言的接口
  4. JS原生选项卡 – 幻灯片效果
  5. 【php】 PHP 支持 9 种原始数据类型
  6. java并发编程实战:第十六章----Java内存模型
  7. Mybatis学习记录-使用问题总结之一DISTINCT
  8. Yii 错误页面处理
  9. wamp环境下安装imagick扩展
  10. iOS7的界面上移问题