精华内容
下载资源
问答
  • 由于当时需求的人不是太多,所以我也不当一回事,这段时间突然又能发现很多人发QQ消息给我说要这个东西,我就花了一个晚上的时候进行电路设计,现在已将程序与原理图,PCB生成。其效果就相当于内置重启,而且速度更...

    今年年初的时候,我在博客中和大家说要做一种小电路,可以挂在RESET按钮上面的然后时间到了可以向主板发送一个低电平告诉他要复位主板,以保证硬盘的安全,也更简单方便,省得多一台机器来运行重启工具?由于当时需求的人不是太多,所以我也不当一回事,这段时间突然又能发现很多人发QQ消息给我说要这个东西,我就花了一个晚上的时候进行电路设计,现在已将程序与原理图,PCB生成。其效果就相当于内置重启,而且速度更快

    这个东西的销售价格在25元以下,如果说需要的人多的话,我可以考虑国庆后发去工厂统一做。下面我给大家看一下PCB图

    PCB为两面的,两面都覆铜,效果不错,电路也简单。

    这个是能过STC 的单片机的定时器产生精准的时间计数,并累加到70小时的时候向主板发送一个复位信号。

    本电路有装电源正负级接反电路及一个运行灯,当电路在运行时绿色的GREEN会一闪一闪的。

    如果需要这个东西的,可以留言并留下您的邮箱,我会根据情况民否做这个电路。

    电路板尺寸:4cm*2cm,下面的图片是放大的

    正面:

    反面:

    转载于:https://www.cnblogs.com/lome/archive/2011/10/01/2197037.html

    展开全文
  • 于是,我又打开升级消息,仔细的读了一下:企业号将迁移至企业微信管理后台(work.weixin.qq.com/login)进行统一管理。之前企业公众号的管理后台地址是qy.weixin.qq.com,不了消息难道是接口地址也变了吗。 登到...
  • 于是,我又打开升级消息,仔细的读了一下:企业号将迁移至企业微信管理后台(work.weixin.qq.com/login)进行统一管理。之前企业公众号的管理后台地址是qy.weixin.qq.com,不了消息难道是接口地址也变了吗。登到新...

    最近,看到消息,说是微信把企业公众号升级到企业微信。当时并没有在意,但是后来发现之前用企业公众号的接口来发通知消息的程序发不出去消息了。

    于是,我又打开升级消息,仔细的读了一下:企业号将迁移至企业微信管理后台(work.weixin.qq.com/login)进行统一管理。之前企业公众号的管理后台地址是qy.weixin.qq.com,发不了消息难道是接口地址也变了吗。

    登到新后台看了下,发现应用的Secret值变了,相比之前位数要少一些。将代码中的Secret值替换成新的之后,发现还是不行。debug看了下,在用post请求调用接口发消息的时候报错:{“errcode”:-1,”errmsg”:”Invalid input”}。分析原因可能有两个:调用的发消息接口地址不对了;或者,传的post参数的格式不对了。

    还好,在其官网上找到了企业微信的API说明文档:https://work.weixin.qq.com/api/doc ,上面有较详细的使用说明。经确认,调用接口的url地址并没有变(发送消息还是用https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN)。但是发现文本消息的格式有点不一样,官网示例如下:

        {
           "touser" : "UserID1|UserID2|UserID3",
           "toparty" : " PartyID1|PartyID2 ",
           "totag" : " TagID1 | TagID2 ",
           "msgtype" : "text",
           "agentid" : 1,
           "text" : {
               "content" : "你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看<a href=\"http://work.weixin.qq.com\">邮件中心视频实况</a>,聪明避开排队。"
           }
        }

    上面的UserID、PartyID这些应该我之前都是当数值传的,但示例上是放在引号里面的,那就是被当做字符串了。于是,我把代码也改成按字符串的方式试了下,结果可以了。。。

    展开全文
  • 货铺QQ群号:834508274 微信群不能扫码进了,可以加我微信SAPliumeng拉进群,申请时请提供您哪个模块顾问,否则是一律不通过的。 进群统一修改群名片,例如BJ_ABAP_森林木。群内禁止广告及其他一切无关链接,小...

    货铺QQ群号:834508274

    微信群不能扫码进了,可以加我微信SAPliumeng拉进群,申请时请提供您哪个模块顾问,否则是一律不通过的。

    进群统一修改群名片,例如BJ_ABAP_森林木。群内禁止发广告及其他一切无关链接,小程序等,进群看公告,谢谢配合 

    不修改昵称会被不定期踢除,谢谢配合

    SAP系统中发送消息的几种办法
    1SM02
    创建消息,并设定有效期。当用户刷新窗口或打开窗口时会显示。
    这个消息对client中的所有用户有效 SAP系统中发送消息的几种办法

    在系统消息文本中输入要发送的消息;
    服务器:如果一个系统中有多个Instance 可以,并且只对某一个Instance所在的服务器进行维护时,可以反选,否则系统默认整个系统都收到此消息;
    CLIENT:只是将消息发送到某一个集团;
    截止于:系统在此时间之后,将会不起作用;
    删除日期:在此日期之后,消息将删除于SM02
    回车确认消息:
    此文本消息将会发给系统上的每一个用户;
    发出去的消息,可以更改删除!
    2So00中创建“到期邮件”
    So00中创建一个普通邮件,在下面选择收件人,收件人后面有三个可选项,选中第一个(闪电标志):到期邮件
    邮件发出后,当用户刷新窗口或打开窗口时会显示。
    3、给指定人发信息
    一、FM TH_POPUP
           适用范围:发给单个用户消息可以使用此方法;
           T_code: SE37;
    SAP系统中发送消息的几种办法

       F8 运行,出现输入参数界面;
    SAP系统中发送消息的几种办法

    RFC 目标系统:如果你要跨系统发送消息的时候可以输入RFC目标系统;
    CLIENT: 接收者所在的集团;
    USER     接收者的SAP用户名;
    MESSAGE: 要发送的信息;
    点击运行,出现以下效果:CLIENT300,上的用户XXXXX ,被强制停止;
    如果考虑到方便:如对若干个用户发送强制退出的消息,而又不影响其它用户的操作,可开发一程序,批量导入强制退出的消息,在程序里循环设用此FM可以很好的解决;
    运行后,如下图所示:
    SAP系统中发送消息的几种办法

    展开全文
  • 模拟QQ,在线群聊:底层就是 采用 TCP的编程思想,每个用户必须连接到服务器才能进行聊天,用户之间的群聊还是私聊都... 协议如下: 客户端向服务器消息格式设计: 命令关键字@#接收方@#发送方@#消息内容 ...

        模拟QQ,在线群聊:底层就是 采用 TCP的编程思想,每个用户必须连接到服务器才能进行聊天,用户之间的群聊还是私聊都必须要用过服务器进行处理和转发。

        网络通信的关键就是在于协议,所以设计软件最麻烦的就是在定义协议这个地方,需要统一信息传递的格式。

        协议如下:

            客户端向服务器发的消息格式设计:
            命令关键字@#接收方@#发送方@#消息内容
            1)连接:userName      ----握手的线程serverSocket专门接收该消息,其它的由服务器新开的与客户进行通讯的socket来接收
            2)退出:exit@#全部@#userName@#null
            3)发送: on @# list.getSelectedValue() @# tfdUserName.getText() @# tfdMsg.getText()

            服务器向客户端发的消息格式设计:
            命令关键字@#发送方@#消息内容
            登录:
               cmdAdd@#server @# userName (给客户端维护在线用户列表用的)
            退出:
               cmdRed@#server @# userName (给客户端维护在线用户列表用的)
            发送:

               msg   @#消息发送者 @# 消息内容

    效果图:



    代码:

       客户端:
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    
    import javax.swing.DefaultListModel;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.border.TitledBorder;
    
    /**
     * 
     * 2018年5月13日 上午8:55:32
     * @author <a href="mailto:447441478@qq.com">宋进宇</a>
     *
     */
    public class ClientForm extends JFrame implements ActionListener{
    	private static final long serialVersionUID = 1L;
    	
    	//服务器端的 IP 和 PORT
    	private static final String IP = "127.0.0.1";
    	private static final int PORT = 9999;
    	
    	private JTextField tfdUserName; //用户标识
    	
    	private JList<String> list; //在线用户列表--表现层
    	private DefaultListModel<String> lm; //在线用户列表--数据层
    	
    	private JTextArea allMsg = new JTextArea(); //消息显示主窗口
    	private JTextField tfdMsg; //发消息输入框
    	
    	
    	private Socket socket = null;
    	
    	private JButton btnConn;
    	
    	public ClientForm() {
    		setBounds( 300, 300, 400, 300 );
    		
    		//1上部面板
    		JPanel p = new JPanel();
    		
    		p.add( new JLabel( "用户标识:" ) );
    		tfdUserName = new JTextField( 10 );
    		p.add( tfdUserName );
    		btnConn = new JButton( "连接" );
    		btnConn.setActionCommand( "connection" );
    		btnConn.addActionListener( this );
    		p.add( btnConn );
    		JButton btnExit = new JButton( "退出" );
    		btnExit.setActionCommand( "exit" );
    		btnExit.addActionListener( this );
    		p.add( btnExit );
    		
    		this.add( p, BorderLayout.NORTH ); //添加到上部
    		
    		//2中部面板
    		JPanel centerP = new JPanel();
    		centerP.setLayout( new BorderLayout() );
    		//2.1东 在线用户列表
    		lm = new DefaultListModel<String>();
    		lm.addElement( "全部" );
    		list = new JList<String>( lm );
    		list.setSelectedIndex( 0 );
    		list.setVisibleRowCount( 2 );
    		JScrollPane jsc = new JScrollPane( list );
    		jsc.setBorder( new TitledBorder( "在线" ) );
    		jsc.setPreferredSize( new Dimension( 70, centerP.getHeight() ) );
    		centerP.add( jsc, BorderLayout.EAST );
    		
    		//2.2中  聊天信息窗口
    		allMsg.setEditable( false );
    		centerP.add( new JScrollPane( allMsg ) );
    		
    		//2.3南  消息发送面板
    		JPanel sendP=new JPanel();
    		sendP.add( new JLabel( "消息:" ) );
    		tfdMsg = new JTextField( 20 );
    		sendP.add( tfdMsg );
    		JButton btnSend = new JButton( "发送" );
    		btnSend.setActionCommand( "send" );
    		btnSend.addActionListener( this );
    		sendP.add( btnSend );
    		
    		centerP.add( sendP, BorderLayout.SOUTH );
    		
    		this.add( centerP ); //添加到中部
    		
    		addWindowListener( new WindowAdapter() {
    
    			@Override
    			public void windowClosing(WindowEvent e) {
    				//退出前,先服务器发送退出消息
    				sendExitMsg();
    			}
    			
    		});
    		
    		setVisible(true);
    	}
    	
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		if ( "connection".equals( e.getActionCommand() ) ) {//链接
    			try {
    				socket = new Socket( IP, PORT );
    				//连接成功就给服务器发送用户名
    				PrintWriter pw = new PrintWriter( socket.getOutputStream(), true );
    				pw.println( tfdUserName.getText() );
    				//把 tfdUserName 设置不可编辑,同时 把 连接按钮置灰
    				tfdUserName.setEditable( false );
    				btnConn.setEnabled( false );
    				//同时设置一下 标题
    				setTitle( "Java修仙群-在线中..." );
    				
    				//开一个线程接收服务器发送过来的信息
    				new Thread( new Receive() ).start();;
    			} catch (IOException e1) {
    				JOptionPane.showMessageDialog( this, "服务器未启动..." );
    				return;
    			}
    		} else if ( "exit".equals( e.getActionCommand() ) ) {
    			//退出前向服务器发送退出消息
    			sendExitMsg();
    			
    		} else if ( "send".equals( e.getActionCommand() ) ) {
    			//如果 用户没有登入 就不能发送信息
    			if ( socket == null ) {
    				JOptionPane.showMessageDialog( this, "请您登入后再发送信息");
    				return;
    			}
    			PrintWriter pw = null ;
    			try {
    				pw = new PrintWriter( socket.getOutputStream(), true );
    			} catch (IOException e2) {
    				e2.printStackTrace();
    				return;
    			}
    			int index = list.getSelectedIndex();
    			if ( index == 0 ) { //如果index==0说明是发送给所有人
    				String mes = "send@#all@#" + tfdUserName.getText() + "@#" + tfdMsg.getText();
    				pw.println( mes );
    				//更新消息栏
    				allMsg.append( "您说:" + tfdMsg.getText() + "\r\n" );
    			} else {//否则 就是 私发消息
    				if ( lm.get(index).equals( tfdUserName.getText() ) ) {
    					JOptionPane.showMessageDialog( this, "不能跟自己私聊..." );
    					return;
    				}
    				String mes = "send@#" + lm.get(index) + "@#" + tfdUserName.getText() + "@#" + tfdMsg.getText();
    				pw.println( mes );
    				allMsg.append( "您悄悄对" + lm.get(index) + "说:" + tfdMsg.getText() + "\r\n" );
    			}
    			//发送完毕后清空tfdMsg
    			tfdMsg.setText( "" );
    		}
    	}
    
    	/**
    	 * 发送退出消息
    	 */
    	private void sendExitMsg() {
    		if ( socket != null ) {
    			try {
    				PrintWriter pw = new PrintWriter( socket.getOutputStream(), true );
    				pw.println( "exit@#all@#" + tfdUserName.getText() + "@#" );
    			} catch (IOException e1) {
    				e1.printStackTrace();
    				return;
    			} finally {
    				//退出程序
    				System.exit( 0 );
    			}
    		} else {
    			System.exit( 0 );
    		}
    	}
    	/**
    	 * 2018年5月12日 下午8:09:11
    	 * @author <a href="mailto:447441478@qq.com">宋进宇</a>
    	 *	内部类,用来接收 别的用户发送过来的信息
    	 */
    	class Receive implements Runnable {
    
    		@Override
    		public void run() {
    			//如果 socket 就退出
    			if ( socket == null ) {
    				return;
    			}
    			BufferedReader br = null;
    			try {
    				br = new BufferedReader( 
    						 new InputStreamReader( socket.getInputStream() ) );
    				//只有有消息就接收
    				while ( true ) {
    					String mes = br.readLine();
    					//如果 消息无效 就跳过
    					if ( mes == null || mes.trim().length() == 0) {
    						continue;
    					}
    					dealWithMessage( mes );
    				}
    				
    			} catch (IOException e) {
    				e.printStackTrace();
    				return;
    			} 
    		}
    		/**
    		 * 处理服务器发送过来的信息
    		 * 信息内容格式 --命令关键字@#发送方@#消息内容
    		 * 命令关键字:cmdAdd,cmdRem,msg
    		 * 发送方: server/otherUserNaem
    		 * 消息内容:userNaem/消息内容
    		 * @param mes 服务器发送过来的信息
    		 */
    		private void dealWithMessage(String mes) {
    			String[] strs = mes.split( "@#" );
    			if ( strs.length < 3 ) {
    				return;
    			}
    			if ( "cmdAdd".equals( strs[0] ) ) { //处理cmdAdd指令
    				//更新  allMsg 
    				allMsg.append( "通知:用户[" + strs[2] + "]上线了\r\n" );
    				//更新 lm 
    				lm.addElement( strs[2] ); //更新数据
    				list.validate(); //实时更新表现层
    			} else if ( "cmdRem".equals( strs[0] ) ) { //处理cmdRem指令
    				//更新 allMsg
    				allMsg.append( "通知:用户[" + strs[2] + "]下线了\r\n" );
    				//更新 lm
    				lm.removeElement( strs[2] ); //更新数据
    				list.validate(); //实时更新表现层
    			} else if ( "msg".equals( strs[0] ) ) { //处理msg指令
    				if ( "server".equals( strs[1] ) ) { //如果是服务器发送的信息说明是用来初始化的在线用户列表的信息
    					allMsg.append( "欢迎您登入!\r\n" );
    					for (int i = 2; i < strs.length; i++) {
    						//更新在线用户列表
    						lm.addElement( strs[i] ); //更新数据
    						list.validate(); //实时更新表现层
    					}
    				}else {//否则的话,就是用户之间的通信了
    					
    					allMsg.append( strs[1] + mes.substring( strs[0].length() + strs[1].length() + 4 ) + "\r\n" );
    				}
    			} 
    			
    		}
    		
    	}
    	
    	public static void main(String[] args) {
    		JFrame.setDefaultLookAndFeelDecorated(true);
    		new ClientForm();
    	}
    
    }
    
    服务器端:
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;
    
    import javax.swing.DefaultListModel;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.KeyStroke;
    import javax.swing.border.TitledBorder;
    
    /**
     * 2018年5月13日 上午7:39:54
     * @author <a href="mailto:447441478@qq.com">宋进宇</a>
     *
     */
    public class ServerForm extends JFrame {
    	private static final long serialVersionUID = 1L;
    
    	//服务器的端口
    	private static int PORT = 9999;
    	
    	private JList<String> list; //在线用户列表--表现层
    	private DefaultListModel<String> lm; //在线用户列表--数据层
    	
    	private JTextArea allInfo = new JTextArea(); //信息显示主窗口
    	
    	private Map<String, Socket> userSockets = new HashMap<String, Socket>();
    
    	private JMenuItem itemRun;
    	
    	public ServerForm() {
    		setTitle( "啊哈哈-服务器" );
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		
    		//1东 在线用户列表
    		lm = new DefaultListModel<String>();
    		lm.addElement( "全部" );
    		list = new JList<String>( lm );
    		list.setVisibleRowCount( 5 );
    		JScrollPane jsc = new JScrollPane( list );
    		jsc.setBorder( new TitledBorder( "在线" ) );
    		jsc.setPreferredSize( new Dimension( 100, this.getHeight() ) );
    		getContentPane().add( jsc, BorderLayout.EAST );
    		
    		//2中  信息主窗口 
    		allInfo.setEditable( false );
    		getContentPane().add( new JScrollPane( allInfo ) );
    		
    		//菜单
    		JMenuBar menubar = new JMenuBar();
    		setJMenuBar( menubar );
    		JMenu menu = new JMenu( "控制(C)" );
    		menubar.add( menu );
    		menu.setMnemonic( 'C' ); //设置菜单助记符
    		itemRun = new JMenuItem( "开启" );
    		itemRun.setActionCommand( "run" );
    		itemRun.setAccelerator(KeyStroke.getKeyStroke( 'R', KeyEvent.CTRL_MASK ) );//设置快捷键: Ctrl+R
    		menu.add( itemRun );
    		menu.addSeparator();
    		JMenuItem itemExit = new JMenuItem( "退出" );
    		itemExit.setActionCommand( "exit" );
    		itemExit.setAccelerator( KeyStroke.getKeyStroke( 'E', KeyEvent.CTRL_MASK ) );//设置快捷键: Ctrl+E
    		menu.add( itemExit );
    		
    		//监听器
    		ActionListener al = new ActionListener() {
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				if( e.getActionCommand().equals( "run" ) ){
    					new Thread() {//采用 匿名内部类,重写Thread的 run方法
    						public void run() {
    							serverRun();
    						}
    					}.start();
    					
    				}else if( e.getActionCommand().equals( "exit" ) ){
    					System.exit( 0 );
    				}
    				
    			}
    		};
    		//给2个菜单项添加监听
    		itemRun.addActionListener( al );
    		itemExit.addActionListener( al );
    		
    		
    		
    		int winWidth = 500;
    		int winHeight = 400;
    		Toolkit toolkit = Toolkit.getDefaultToolkit();
    		int width = (int) toolkit.getScreenSize().getWidth();
    		int height =  (int)toolkit.getScreenSize().getHeight();
    		setBounds( width/2 - winWidth/2, height/2 - winHeight/2, winWidth, winHeight );
    		
    		setVisible(true);
    	}
    	/**
    	 * 启动服务器
    	 */
    	protected void serverRun() {
    		ServerSocket server = null;
    		try {
    			server = new ServerSocket( PORT );
    			//在 服务器信息栏 添加服务器启动信息
    			allInfo.append( server + "--服务器启动了\r\n" );
    			//启动服务器后,关闭启动菜单项
    			itemRun.setEnabled( false );
    			while ( true ) {
    				Socket s = server.accept();
    				new Thread( new UserRun( s ) ).start();
    			}
    		} catch (IOException e) {
    			System.exit( -1 );
    		} finally {
    			if ( server != null ) {
    				try {
    					server.close();
    				} catch (IOException e) {
    				}
    			}
    		}
    	}
    	
    	class UserRun implements Runnable {
    		private Socket s = null;
    
    		public UserRun(Socket s) {
    			this.s = s;
    		}
    
    		@Override
    		public void run() {
    			//用户一连接上就获取用户IP
    			String userIp = s.getInetAddress().getHostAddress();
    			BufferedReader br = null;
    			try {
    				//能到这里说明一个用户链接成功
    				//获取用户名
    				//这里规定用户名为一行
    				br = new BufferedReader(
    						 new InputStreamReader( s.getInputStream() ) );
    				
    				String userName = br.readLine();
    				//把用户信息放人 userSockets 中
    				userSockets.put( userName, s );
    				//更新allInfo
    				allInfo.append( "IP:" + userIp + ",port:" + s.getPort() + ",userName:" + userName + ",上线了!\r\n");
    				lm.addElement( userName );
    				//把在线的用户信息反馈给当前用户
    				initData();
    				//同时通知其他用户
    				String mes = "cmdAdd@#server@#" + userName;
    				notifyOthersUser( mes, userName );
    				//通知完毕后等待用户发来信息
    				while ( true ) {
    					//用户信息
    					mes = br.readLine();
    					//如果 mes 为无效数据就跳过
    					if ( mes == null || mes.trim().length() == 0) {
    						continue;
    					}
    					//解析用户信息
    					//用户信息规则:命令关键字@#接收方@#发送方@#消息内容
    					//命令:exit/send,接收方:all/otherUserName,发送方:userName,消息内容:...
    				
    					try {
    						dealWithMessage( mes );
    					} catch (Exception e) {
    						//用户下线就退出循环
    						break;
    					}
    				}
    				
    			} catch (IOException e) {
    			}
    		}
    		/**
    		 * 给用户反馈当前 在线 用户。
    		 */
    		private void initData() {
    			try {
    				PrintWriter pw = new PrintWriter( s.getOutputStream(), true );
    				StringBuilder sb = new StringBuilder( "msg@#server" );
    				Set<String> names = userSockets.keySet();
    				for (String name : names) {
    					sb.append( "@#" + name );
    				}
    				pw.println( sb.toString() );
    			} catch (IOException e) {
    				e.printStackTrace();
    				return ;
    			}
    			
    		}
    
    		/**
    		 * 处理用户发送的信息,
    		 * 用户信息规则:命令关键字@#接收方@#发送方@#消息内容,
    		 * 命令:exit/send,
    		 * 接收方:all/otherUserName,
    		 * 发送方:userName,
    		 * 消息内容:...
    		 * @param mes 用户发送的信息
    		 * @throws Exception 抛出该异常说明用户下线了
    		 */
    		private void dealWithMessage( String mes ) throws Exception {
    			//如果消息无效 就不处理
    			if ( mes == null || mes.trim().length() == 0) {
    				return;
    			}
    			String[] strs = mes.split("@#");
    			if ( "exit".equals( strs[0] ) ) {//进行退出处理
    				String str = "cmdRem@#server@#" + strs[2] ;
    				notifyOthersUser( str, strs[2] );
    				//同时在 userSockets中移除该用户
    				Socket s = userSockets.remove( strs[2] );
    				//更新allInfo
    				allInfo.append( "IP:" + s.getInetAddress().getHostAddress() + ",port:" + s.getPort() + ",userName:" + strs[2] + ",下线了!\r\n");
    				lm.removeElement( strs[2] );
    				//关闭s
    				s.close();
    				throw new Exception();
    			} else if ( "send".equals( strs[0] ) ){//进行发送处理
    				//组织信息
    				String str = "msg@#" + strs[2] + "@#说:" + mes.substring( strs[0].length() + strs[1].length() + strs[2].length() + 6 );
    				if ( "all".equals( strs[1] ) ) {//如果是发送给所有人
    					System.out.println( str );
    					notifyOthersUser( str, strs[2] );
    				} else {
    					str = "msg@#" + strs[2] + "@#悄悄对您说:" + mes.substring( strs[0].length() + strs[1].length() + strs[2].length() + 6 );
    					Socket target = userSockets.get( strs[1] );
    					System.out.println( strs[1] );
    					PrintWriter pw = new PrintWriter( target.getOutputStream(), true );
    					pw.println( str );
    				}
    			}
    		}
    
    		/**
    		 * 通知除了  userName 的其他用户。通知内容格式 --命令关键字@#发送方@#消息内容
    		 * 命令关键字:cmdAdd,cmdRem,msg
    		 * 发送方: server/otherUserNaem
    		 * 消息内容:userNaem/消息内容
    		 * @param mes 通知内容格式 --命令关键字@#发送方@#消息内容
    		 * @param userName 该用户状态
    		 */
    		private void notifyOthersUser(String mes, String userName) {
    			Set<Entry<String, Socket>> entrys = userSockets.entrySet();
    			for (Entry<String, Socket> en : entrys) {
    				//如果是当前用户就跳过
    				if ( en.getKey().equals( userName ) ){
    					continue;
    				}
    				Socket s = en.getValue();
    				try {
    					PrintWriter out = new PrintWriter( s.getOutputStream(), true );
    					//给 除了 userName 的其他所有用户发送消息
    					out.println( mes );
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    		
    	}
    	
    	public static void main(String[] args) {
    		JFrame.setDefaultLookAndFeelDecorated(true);
    		new ServerForm();
    	}
    	
    }
    

    展开全文
  • 企业管理软件的破冰(三)

    千次阅读 2009-02-24 21:33:00
    于是,都扎堆进去做互联网,有人做了统一消息(类似饭否,把MSN/QQ/GTALK/邮件/短信都串起来),有人做了论坛,有人做了CMS,有人做了点评,有人做了分类,有人做了SNS,有人做了网店,有人做了SaaS OA(含项目管理、...
  •   查看微信好友男女比例 想统计下自己微信里好友的性别比例...接着来实现一个类似qq上的自动回复,原理就是接收到消息,就发消息回去,同时发一条给文件助手,就可以在文件助手中统一查看消息。 代码很简单,...
  • 软件类型:邮件收发 ...5、消息免费发:支持“聊天”功能,在线用户免费互发消息,支持普通短信首发;短信消息统一管理,多人聊天互不影响。 6、设置更贴心:手机邮内设“流量统计”、“消息黑名单”等贴心工具。
  • 软件类型:邮件收发 ...5、消息免费发:支持“聊天”功能,在线用户免费互发消息,支持普通短信首发;短信消息统一管理,多人聊天互不影响。 6、设置更贴心:手机邮内设“流量统计”、“消息黑名单”等贴心工具。
  • 软件类型:邮件收发 ...5、消息免费发:支持“聊天”功能,在线用户免费互发消息,支持普通短信首发;短信消息统一管理,多人聊天互不影响。 6、设置更贴心:手机邮内设“流量统计”、“消息黑名单”等贴心工具。
  • 软件类型:邮件收发 ...5、消息免费发:支持“聊天”功能,在线用户免费互发消息,支持普通短信首发;短信消息统一管理,多人聊天互不影响。 6、设置更贴心:手机邮内设“流量统计”、“消息黑名单”等贴心工具。
  • websocket

    2017-08-22 10:14:25
    聊天室原理我们经常用到的社交软件,qq,微信,以及一些网站的聊天室,就比方说群聊,他们的模式大都是,所有的客户端请求都发送到同一个服务器上,服务器统一处理,将收到的信息再广播到这个聊天室的用户的客户端...
  • 我要做的功能是 微信公众号网页和微信小程序可以互语音消息功能 微信对两者都提供了语音功能 对于微信公众号网页录音文件的编码方式为 amr 对于微信小程序则支持 mp3等等 以下是微信小程序支持的格式说明 文档...
  • 2.0 版和 1.x 版的差别

    2021-01-09 14:36:21
    会向主线程发消息(实际是将一个 Message 对象放入一个消息队列中去)。主线程不停的从消息队列中取出消息,并根据消息类型调用相应的回调函数。所有对联系人资料的查询和更新等操作均在主线程中...
  • 今天好哥们突然给我来一条QQ消息,问迭代器能不能修改集合,用过迭代器的小伙伴应该都知道这一点:迭代器是用来统一对于List和Set集合的遍历方式的,至于能不能修改集合中的元素,讲真的,我没去思考过。...
  • 今天好哥们突然给我来一条QQ消息,问迭代器能不能修改集合,用过迭代器的小伙伴应该都知道这一点:迭代器是用来统一对于List和Set集合的遍历方式的,至于能不能修改集合中的元素,讲真的,我没去思考过。...
  • 企业即时通讯源码

    2007-09-03 13:59:27
    在 NetMessenger 上发消息完全可以和手头的其他工作同时进行。比 Email 要快速,无需等待;比电话交流 方式要丰富,不用消耗时间在拨电话、等待对方接听、或者对方不在时要多次重拨等,可以省去许多长途电话 ...
  • (本文中,QQ/微信群统一写为“社群”) 最开始,喜欢水群,段位:大家都有点熟悉我的ID。 紧接着,加入团队,运营相关群聊,段位:管理员(那时已开始自建群,到现在自由发展至三群)。 到后来,某厂实习,业务之一...
  • 助创cms众筹系统1.0

    2016-08-18 12:08:35
    助创cms众筹系统可以10分钟帮你打造一个和京东众筹...会员发布项目必须要认证通过,管理员后台统一认证管理; 十二、系统消息推送 后台可以推送消息给全部会员,支持会员分类别推送; 演示站:http://zc.izhuchuang.com
  • - 只要你自己不在群里发消息,这个群理论上是不算存在的,别人也就无从发现。 - 检测完,一旦你自己退出群聊或者删除群,此群就算解散了,所以不会留下痕迹。 手机端也能收到被撤回的消息 如果Mac拦截到A发送来的...
  • 对于微信服务器来的消息,提供匹配器(Matcher),拦截器(interceptor),处理器(Handler)接口,定制实现,具有可扩展性。 超级详细的实例教程,基于SpringBoot+Wx-tools 音乐爬虫推送公众号 w3cschool...
  • 脉动论坛Ⅲ.rar

    2019-08-30 05:54:48
    17. 鲜花鸡蛋金钱炸弹(带后台管理,可以消息通知对方) 三.插件部分 1. 个人文集,完全和动网论坛结合,有后台管理,功能强大。 2. 下载中心,最新全功能的下载管理和使用。带后台管理。 3. 个人相册,会员...
  • *更新修复了部分不能工作短消息 *增强验证码程序   FerdinandOA办公为asp开发的OA类办公软件系统。 1 、 COOKIES 、 SESSION 二种记录用户资料方式,使不支持 COOKIESE 的浏览器自动选择 SESSION 方式记录...
  • 3、代理商与管理员之前互内部消息。 4、管理员向所有代理商广播消息。 5、代理商向管理员发送存款上帐催促单。 号码归属地显示 全国最新号段库,准确查询号码归属地。 服务器相互供货 1、在供货服务器...
  • 购买模块后请联系客服,您使用说明和资源包; 说明:商业版和开源版,两个版本功能完全一样,只是一个是加密的、一个是没有加密的;如果不是打算购买后进行二次开发话,您购买商业版即可,后续需要开源版的时候也...

空空如也

空空如也

1 2 3 4
收藏数 70
精华内容 28
关键字:

qq统一发消息