- 浏览: 797333 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (480)
- Spring (12)
- Hibernate (8)
- Struts2 (4)
- Java 基础-JDK-类-接口-URI-专题研究 (27)
- 线程、线程池、多线程高并发高可用、Socket通信 (15)
- Oracle数据库 (20)
- 一般-前端js-html-其它 (25)
- JYSK-互联网金融、金融科技、支付、公司、新闻等等 (8)
- Ajax-jQuery开源框架 (7)
- Json-轻量级的数据交换格式 (14)
- JavaScript (15)
- Jsp、Servlet、Servlet+JSP+JavaBean开发模式(MVC) (18)
- Html-JavaScript-前端-调用接口 (12)
- Sql Server 2005 (6)
- 正则表达式 (2)
- Java tools (18)
- 加签与验签、加密与解密 (3)
- Ajax技术核心-xmlHttpRequest(简称XHR) (6)
- xml-数据交换格式 (3)
- 信息采集 (1)
- Http - Https - HttpClient - httpCore-SSL-TLS (10)
- HtmlParser (2)
- 标签库 (1)
- SMS (2)
- jxl-导入导出 (4)
- poi-导入导出 (2)
- 定时器Timer+Quartz (6)
- 工作流引擎JBPM3.2.3 (4)
- 工作流引擎JBPM4 (0)
- 数据源-JNDI (0)
- tomcat、weblogic等应用服务器 (6)
- 工作流引擎jbpm5 (1)
- 搜索引擎Lucene (1)
- ant (1)
- 大数据-HBase (2)
- bigtable (0)
- 数据库设计 (4)
- jquery tab (0)
- mybatis (5)
- jquery ui 1.10.3 (5)
- Jboss7 (1)
- 规则引擎drools (0)
- 工作流引擎Activiti5 (0)
- 数据库-用户自定义函数 (0)
- 数据库-存储过程 (2)
- 数据库-视图 (0)
- 数据库-触发器 (0)
- 数据库-sql (2)
- highcharts-图表工具 (1)
- sql server 2008 (6)
- 诗词-工作室 (2)
- 数据割接 (1)
- GIS-地理信息系统 (2)
- RS-遥感技术 (1)
- GPS-全球定位系统 (1)
- java整合flex_RIA开发 (3)
- C#编程语言 (5)
- webservice_axis2_cxf_soap_wsdl (2)
- sql语句 (3)
- Flex_WebService_GIS (25)
- PHP编程语言 (0)
- ExtJS4.2 (1)
- Spring mvc (5)
- EasyUI1.4.2 (16)
- 日期时间工具类 (4)
- 随机数 (1)
- Arcgis api for js (0)
- Mysql数据库 (9)
- 移动互联网 java html5/flash socket netty (0)
- API接口 (1)
- AndroidStudio (0)
- Git (2)
- Maven (5)
- IDEA (0)
- 大数据-Hadoop (2)
- JPA (0)
- Spring boot (4)
- JSF (0)
- nginx_lua_module_redis (2)
- Activiti (1)
- bootstrap (1)
- AngularJS (10)
- 数据库-索引 (1)
- Linux及其连接工具SSH (4)
- java日志管理 (2)
- islider滑动控件 (1)
- jquery (1)
- 异常处理Exception (1)
- 秒杀与类秒杀系统 (1)
- 连接数据库、数据库连接池 (4)
- 数据库-临时表 (1)
- 软件设计模式-单例、多例、代理、工厂、观察者 (3)
- 集合框架 (5)
- 人工智能--Artificial intelligence、神经网络算法、机器学习 (1)
- 分布式应用 (1)
- SOA服务-Dubbo框架-Thrift框架 (2)
- Zookeeper分布式服务框架 (2)
- intellij idea (1)
- python编程语言 (0)
- 消息队列_MQ (0)
- 消息队列_RabbitMQ (2)
- 消息队列_ActiveMQ (1)
- 消息队列_Kafka (2)
- 缓存_Redis (4)
- 缓存_Memcache (0)
- 缓存_Ehcache (0)
- ivy-ivyde (1)
- google-protocol buffers (1)
- 正向代理-正向代理服务器 (1)
- 反向代理-反向代理服务器 (1)
- JVM内存模型 (0)
- Thunder框架 (1)
- NIO-非阻塞式IO (0)
- 软件测试、性能测试 (1)
- 序列化、Serializable接口、Externalizable接口 (3)
- 线程池-ExecutorService-ThreadPoolExecutor (1)
- web.xml (1)
- java开发-java工具-实用工具网站 (6)
- 医疗 (1)
- Filter-过滤器 (2)
- Unicode码-双字节字符编码 (1)
- OpenResty (1)
- 计算机网络 (1)
- eclipse_myeclipse_intellij idea (3)
- Enum (1)
- 大数据--Big Data (1)
- 云计算--Cloud computing (1)
- Elastic-Job (1)
- Redis (2)
- 文件流-IO操作 (6)
- 计算机基础知识 (1)
- Hessian-二进制RPC协议 (1)
- String类 (3)
- BigDecimal类 (1)
- java重要接口 (1)
- ReactJS (1)
- 跨域问题 (0)
- Map (1)
- 注解 (1)
- ASCII码-单字节字符编码 (1)
- 微服务、微服务架构 (2)
- RPC协议、RPC服务、RPC框架 (0)
- java反射 (1)
- java项目之classpath (1)
- 经典算法-树 (1)
- listener-监听器 (1)
- Interceptor-拦截器 (1)
- pojo javabean (2)
- 计算机科学与技术-进阶 (1)
- 代码规范与文档编写 (1)
- UML-统一建模语言 (1)
- 对接微信、支付宝 (3)
- 压力测试 (1)
- 办公软件-Excel (1)
- 办公软件-PPT (0)
- UTF8、GBK编码 (1)
- 微服务架构:Spring Cloud架构-Dubbo架构 (6)
- Nginx (1)
- 点滴业务 (1)
- form表单-json数据-转换与接口调用 (1)
- Junit单元测试 (1)
- 大数据-Spark (1)
- 大数据-Storm (1)
- 数据库事务-Spring事务 (0)
- elasticsearch (1)
- windows (1)
最新评论
1、主程序
2、推送消息单例类
3、模拟客户端访问
===============================================================================
1、服务端监听端口
2、调用
3、SingletonServerSocket 单例类-服务端写数据
4、客户端读数据
/** * 主程序启动入口 * * @param args */ public static void main(String[] args) { ctx = new ClassPathXmlApplicationContext(APPLICATION_XML_FILE); ctx.start(); // SingletonMessagePush instance=SingletonMessagePush.getInstance();//单例服务类 try { ServerSocket serverSocket=new ServerSocket(getMessagePushPort());//serverSocket,只负责监听客户端连接,一旦连接成功,服务端会新建一个socket负责与客户端通信 while(true){//不断监听客户端连接 Socket socket = serverSocket.accept();//返回一个客户端的Socket对象实例 // System.out.println("【发现客户端连接>>>>>>】"); if(null!=socket){ CopyOnWriteArrayList<Socket> oldList=instance.getSocket(); for (Socket so : oldList) { if(so.isConnected()==false||so.isClosed()==true){ instance.getSocket().remove(so);//移除 System.out.println(so.getInetAddress()+"从socket客户端集合移除。"); } } if(socket.isConnected()==true&&socket.isClosed()==false){ instance.getSocket().add(socket);//添加客户端socket System.out.println("添加客户端:"+socket.getInetAddress()+",当前有效客户端总数:"+instance.getSocket().size()); } } } } catch (Exception e) { e.printStackTrace(); System.out.println("主程序启动时服务端socket异常"); } }
2、推送消息单例类
package com.vxichina.cluster.persistence.core; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.Socket; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @author mingfeng.wang * @date 2016年3月15日 * @time 上午10:54:18 * 向录屏程序推送消息的类 */ public class SingletonMessagePush { //有效客户端socket连接集合 private CopyOnWriteArrayList<Socket> socket=new CopyOnWriteArrayList<Socket>(); //线程池 private ExecutorService threadPool=Executors.newCachedThreadPool(); //private构造函数 private SingletonMessagePush(){ } private static SingletonMessagePush instance; //对外访问方法 public static SingletonMessagePush getInstance(){ if(null==instance){ instance=new SingletonMessagePush(); } return instance; } /** * 推送消息的主方法 * @param dataStr */ public void doMain(String dataStr){ try { if(null!=dataStr&&!"".equals(dataStr)){ if(null!=socket&&socket.size()>0){ //#s 给所有有效连接的客户端推送消息 for (Socket sc : this.getSocket()) { final String message=dataStr; final Socket clientSocket=sc; if(sc.isConnected()==true&&sc.isClosed()==false){ //new Thread(new Task(sc,dataStr)).start();//多线程 Thread.sleep(0); //线程池方式 threadPool.execute(new Runnable() { @Override public void run() { try { System.out.println("当前线程name="+Thread.currentThread().getName()+", id="+Thread.currentThread().getId()); // 服务端写数据 Writer writer = new OutputStreamWriter(clientSocket.getOutputStream()); writer.write(message); writer.flush(); System.out.println("成功给客户端"+clientSocket.getInetAddress()+"推送消息。消息内容:\n"+message); //writer.close();//不能关闭,关闭会导致客户端close一段时间 }catch (Exception e) { System.out.println("给客户端"+clientSocket.getInetAddress()+"推送消息异常。"); } } }); } } //#e }else{ System.out.println("暂无客户端连接。"); } } } catch (Exception e) { e.printStackTrace(); System.out.println("doMain推送消息异常。"); } } public CopyOnWriteArrayList<Socket> getSocket() { return socket; } public void setSocket(CopyOnWriteArrayList<Socket> socket) { this.socket = socket; } }
3、模拟客户端访问
public class ClientSocketTest { public static void main(String[] args) { String host="192.68.19.64";//自定义 int port=9080; try { Socket client = new Socket(host, port); while(true){ System.out.println("【>>>>>>客户端正在监听>>>>>>】,isConnected="+client.isConnected()+",isClosed="+client.isClosed()); // 客户端读数据 Reader reader = new InputStreamReader(client.getInputStream()); char chars[] = new char[64]; int len; StringBuffer sb = new StringBuffer(); while ((len = reader.read(chars)) != -1) { sb.append(new String(chars, 0, len)); } System.out.println("客户端读数据结束。" ); reader.close(); //client.close(); } }catch(java.net.SocketException e){ if(e.getMessage().equals("Connection reset")){ System.out.println("连接被重置,服务端已关闭。"); } }catch (Exception e) { e.printStackTrace(); System.out.println("客户端其它异常。"); } } }
===============================================================================
1、服务端监听端口
private static final String appConfigFile = "/app-config.properties"; public static void main(String[] args) { SingletonServerSocket singletonServerSocket=SingletonServerSocket.getInstance(); try { //System.out.println("端口:"+getMessagePushPort()); ServerSocket serverSocket=new ServerSocket(getMessagePushPort()); singletonServerSocket.setServerSocket(serverSocket);//serverSocket while(true){ Socket socket = serverSocket.accept();//监听,接受客户端连接 if(null!=socket){ singletonServerSocket.setSocket(socket); } } } catch (IOException e) { e.printStackTrace(); } } /** * 从Properties文件中获取推送信息需要监听的socket通信端口 * @return */ public static int getMessagePushPort(){ int port=0; Properties properties = new Properties(); try { properties.load(Object.class.getResourceAsStream(appConfigFile)); } catch (IOException e) { e.printStackTrace(); } port=Integer.valueOf(properties.getProperty("messagePushPort").trim()); return port; }
2、调用
SingletonServerSocket singletonServerSocket=SingletonServerSocket.getInstance();//单例类 //推送socket消息到客户端 singletonServerSocket.doMain(str.toString());
3、SingletonServerSocket 单例类-服务端写数据
public class SingletonServerSocket { private ServerSocket serverSocket; private Socket socket; //private构造函数 private SingletonServerSocket(){ } private static SingletonServerSocket instance; //对外访问方法 public static SingletonServerSocket getInstance(){ if(null==instance){ instance=new SingletonServerSocket(); } return instance; } /** * 推送消息的主方法 * @param dataStr */ public void doMain(String dataStr){ try { if(null!=dataStr&&!"".equals(dataStr)){ if(null!=socket){ new Thread(new Task(socket,dataStr)).start();//多线程 }else{ System.out.println("暂无客户端连接,无法完成写操作。"); } } } catch (Exception e) { e.printStackTrace(); } } /** * 用来处理socket请求的多线程 * * */ static class Task implements Runnable { private Socket socket2; private String data; public Task(Socket socket, String data) { this.socket2 = socket; this.data = data; } public void run() { try { handleSocket();// 处理客户端socket } catch (Exception e) { e.printStackTrace(); } } /** * 跟客户端Socket进行通信 * */ private void handleSocket(){ try { // 服务端写数据 Writer writer = new OutputStreamWriter(socket2.getOutputStream()); writer.write(data); System.out.println("服务端写数据:" + data); writer.flush(); //writer.close(); } catch (java.net.SocketException e) { System.out.println("无法找到写数据的客户端!"); } catch (Exception e) { System.out.println("服务端写数据错误!"); } // socket2.close();//服务端socket,不能关闭 } } public ServerSocket getServerSocket() { return serverSocket; } public void setServerSocket(ServerSocket serverSocket) { this.serverSocket = serverSocket; } public Socket getSocket() { return socket; } public void setSocket(Socket socket) { this.socket = socket; } }
4、客户端读数据
public class ClientSocket { public static void main(String[] args) { String host="192........"; int port=9099; try { Socket client = new Socket(host, port); while(true){ System.out.println("client request..."); if(client.isClosed()){ client = new Socket(host, port); } // 客户端读数据 Reader reader = new InputStreamReader(client.getInputStream()); char chars[] = new char[64]; int len; StringBuffer sb = new StringBuffer(); while ((len = reader.read(chars)) != -1) { sb.append(new String(chars, 0, len)); } System.out.println("客户端读数据:" + sb); reader.close(); client.close(); } } catch (Exception e) { e.printStackTrace(); } } }
发表评论
-
负载均衡
2020-08-27 23:32 290基于nginx配置负载均衡 参考 - - Nginx + Sp ... -
HttpAsyncClient-异步开源框架
2018-06-27 13:09 983引用参考 --了解HttpAsyncClient https: ... -
Callable接口、Future接口
2017-09-11 14:20 453参考博客: --java.util.concurrent 之 ... -
java线程优化方法或思路、高并发、大数据量
2017-09-04 19:17 384一、多线程 【生产问题】 某个接口xServic ... -
java.util.concurrent相关-ThreadPoolExecutor
2017-02-22 16:49 390引用参考: --Java ThreadPoolExecutor ... -
高可用 高并发 java并发相关 ThreadLocal、Volatile
2016-11-23 10:30 433参考博客: --互联网高可用架构技术实践 http://www ... -
java 多线程 AtomicInteger原子变量
2016-03-30 11:22 415/** * AtomicInteger * @au ... -
java四种线程池
2016-03-29 11:29 4901、newCachedThreadPool package ... -
Thread类、Runnable接口、ThreadLocal
2016-03-29 10:40 1029--引用参考 https://blog.csdn.net/u0 ... -
java socket通信编程
2016-03-15 13:22 343http://haohaoxuexi.iteye.com/bl ... -
jvm_多线程_高并发
2013-10-17 14:34 693参考blog --Java中的多线程你只要看这一篇就够了 ht ... -
多线程数据同步之synchronized同步方法-多线程访问临界资源
2013-10-17 10:12 1308package com.tools; /** * 同步方 ... -
jdk+eclipse+adt+sdk+avd的Android环境搭建
2013-03-19 11:28 1066参照: http://mobile.51cto.com/a ... -
Synchronized理解
2012-07-18 15:30 957synchronized 的这个关键字,这个关键字用得比较少, ...
相关推荐
本文将深入探讨如何在Linux环境下利用`select`实现多socket通信,特别是针对UDP协议的服务端实例。 首先,`select`函数是多路复用I/O模型的一种,它允许程序同时监控多个文件描述符(包括socket),等待它们就绪...
以上内容总结了使用Python实现socket非阻塞通讯功能的原理和技巧,包括单进程基本写法、多线程实现、服务端和客户端的具体编程方法等。对于想要深入学习Python网络编程的朋友,文中推荐了多个专题教程,如《Python ...
通过以上介绍,我们可以看出这个项目涵盖了网络编程、文件系统操作、用户权限管理、多线程编程以及跨平台GUI设计等多个方面,对于提升Linux系统和C语言的实践能力具有很高的价值。同时,它也展示了如何将低级系统...
7. **网络编程**:如Socket通信,客户端和服务端的编程实现。 8. **反射机制**:在运行时动态获取类信息并操作对象的能力,常用于插件化开发和自动化测试。 9. **JDBC**:Java数据库连接,用于访问和操作数据库。 ...
8. **网络编程**:Java的Socket编程允许创建客户端和服务端应用,理解TCP和UDP协议,以及Socket和ServerSocket类的使用。 9. **反射机制**:反射机制允许程序在运行时获取类的信息并动态调用方法,这是许多高级功能...
- Socket编程:客户端和服务端通过Socket进行通信。 - URL和URLConnection:用于访问网络资源。 9. **反射机制**: - Class类:代表运行时的类信息,可以动态获取类的属性和方法。 - 构造器和方法的反射调用:...
import asyncore,socket ######################################################################## class AsyncGet(asyncore.dispatcher): """ the defined class """ #----------------------------------...
15. **网络编程**:掌握Socket编程,了解HTTP协议,创建客户端和服务端的网络通信。 每个实例都配有代码和截图,这有助于你直观地理解代码运行过程和结果。同时,.cs文件是源代码文件,可以直接在Visual Studio等...
- **Socket编程**:如何创建TCP和UDP套接字,进行客户端和服务器间的通信。 - **HTTP协议**:理解HTTP的基本概念和工作原理,以及使用Java实现简单的HTTP客户端和服务端。 9. **反射与注解** - **反射**:通过...
- **Socket编程**:实现客户端和服务端的通信,基于TCP/IP协议。 - **URL和URLConnection**:用于访问网络资源。 6. **多线程** - **Thread类**:创建并控制线程,通过`start()`方法启动执行。 - **Runnable...