一.需求

需求如题. 当多个客户端连接服务器时,服务器如何给指定的客户端发送消息.

二.解决方案

核心思想: 在服务器端,需保存不同客户端的socket列表及客户端相关信息.

socket含有发送方和接收方的ip和端口号,所以通过socket就能向指定的客户端发送消息.

经查阅资料,得到如下解决方案:

用户连接时,立即向服务器发送自己的唯一ID,服务器端将ID和对应的socket用map存储. 向客户端发送消息时,就可以通过ID,找到对应的socket,然后向其发送消息.

如果客户端ip固定,服务器每收到一个Socket都用Map

三.实践

说明:采用第一种解决方案,模拟服务器向指定的客户端发送消息.

服务端循环监听,第一个服务器进来,向其发送其自身序号,第二个进来,遍历socke列表,向列表中的每一个客户端发送其对应的序号,从而达到服务器向指定客户端发送消息的功能.

服务器端

package server;

import java.io.*;

import java.net.*;

import java.util.HashMap;/**

* 主函数,实现服务器向指定客户端发送消息的功能.

* 客户端用python书写

* @author dingding

**/

public classRun {private final static int PORT = 30000;public static HashMap socketList = new HashMap<>();public static String channelToken; //socket 令牌

private staticBufferedReader bufferedReader;public static voidmain(String[] args) {try{

ServerSocket server= newServerSocket(PORT);

System.out.println("server is listenning...");while(true){//不断循环随时等待新的客户端接入服务器

Socket clientSocket =server.accept();

bufferedReader= new BufferedReader(newInputStreamReader(clientSocket.getInputStream()));

channelToken=bufferedReader.readLine();

socketList.put(channelToken,clientSocket);//保存会话ID和socket//System.out.println(socketList.get(channelToken));//System.out.println(socketList);

newServerThread(clientSocket,socketList);

}

}catch(IOException e) {

e.printStackTrace();

}

}

}

package server;

import java.io.*;

import java.net.*;

import java.util.*;public classServerThread extends Thread{privateSocket client;private PrintWriter out;private HashMap clientList = new HashMap<>();public ServerThread(Socket socket,HashMapsocketList) throws IOException{

super();

client=socket;

clientList=socketList;

start();

}

@Overridepublic voidrun(){

Socket socket;

System.out.println("Client:"+getName()+"come in...");//每当客户端连接上,就向相应的客户端进行回应

Iterator> entries =clientList.entrySet().iterator();while(entries.hasNext()){

HashMap.Entry entry =entries.next();

System.out.println(entry.getKey());if (!String.valueOf(entry.getKey()).equals("")) {

System.out.println(entry.getValue());

System.out.println("-------------");

socket=entry.getValue();if (socket!=null) {try{out = new PrintWriter(socket.getOutputStream()); //回复client的ID

out.println(entry.getKey());out.flush();

}catch(IOException e) {

e.printStackTrace();

}

}

}

}

}

}

两个客户端用两个python客户端来模拟场景.

#coding = utf-8import socket

import threading

HOST= "localhost"PORT= 30000sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.connect((HOST, PORT))

def test():

socketID= 'I am 111'sock.sendall((socketID+'\r').encode())whileTrue:

data= sock.recv(1024).decode()

print('from line:'+data)

sock.close()if __name__ == '__main__':

test()

#coding = utf-8import socket

import threading

HOST= "localhost"PORT= 30000sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.connect((HOST, PORT))

def test():

socketID= 'I am 000'sock.sendall((socketID+'\r').encode())whileTrue:

data= sock.recv(1024).decode()

print('from line:'+data)

sock.close()if __name__ == '__main__':

test()

四.总结

socket 服务器向指定的客户端发消息,网上给的资源不多,大多是关于服务器群发. 这里给出了具体解决方案,并通过实例证实了该方案的可行性.

有时看的资料越多,越不明白.这并总是好事.

这个时候就需要静下来理理思路,然后针对具体的解决方案,编程实现.

实践才是检验真理的唯一标准,设计代码的时候你就离成功又近了一步.

参考文献

---------------------

作者:Deen12520

来源:CSDN

原文:https://blog.csdn.net/dingding_12345/article/details/72790839

版权声明:本文为博主原创文章,转载请附上博文链接!

java服务器向客户端发消息_socket 服务器向指定的客户端发消息相关推荐

  1. unet服务器向客户端发消息,unet 服务器客户端不同步

    unet 服务器客户端不同步 内容精选 换一换 客户端IP指的是访问者(用户设备)的IP地址.在Web应用开发中,通常需要获取客户端真实的IP地址.例如,投票系统为了防止刷票,需要通过获取客户端真实I ...

  2. java传送字符到前端_mina实现服务器与客户端传送对象或字符串

    NIO是Java New IO的简称,在JDK1.4版本中引入该API,从那时起,就被广泛的应用.通过使用她,可以通过非阻塞的方式进行IO操作. 具体当你需要比较多的并发,而且并发的需要做长连接时,传 ...

  3. 未能分析从服务器收到的消息,WebSocket Javascript客户端未收到来自服务器的消息...

    我已经在本地GlassFish 4.1服务器上部署了Java Web应用程序,该服务器实现了与Web客户端互操作的WebSockets.我能够通过套接字成功执行客户端到服务器的通信,但由于某种原因,服 ...

  4. Java微信公众平台开发(二)--微信服务器post消息体的接收

    转自: http://www.cuiyongzhi.com/post/39.html 在上一篇的文章中我们详细讲述了如何将我们的应用服务器和微信腾讯服务器之间的对接操作,最后接入成功,不知道你有没有发 ...

  5. 服务器怎么把信息发送给用户,java中怎么用tcp/ip将服务器的消息发送给多个用户...

    java中怎么用tcp/ip将服务器的消息发送给多个用户 关注:253  答案:2  mip版 解决时间 2021-01-31 01:26 提问者╬═掵中注定 2021-01-30 20:03 jav ...

  6. Netty服务器部署在Android设备上,接收来自PC客户端的Java Socket客户端发送的JSON数据

    Netty服务器部署在Android设备上,接收来自PC客户端的Java Socket客户端发送的数据 一个简单的模型,在Android手机上部署一个Netty写的服务器,绑定端口9000,等待客户端 ...

  7. qt服务器和客户端发送消息,qt服务器和客户端发送数值

    qt服务器和客户端发送数值 内容精选 换一换 PL/pgSQL是一种可载入的过程语言.用PL/pgSQL创建的函数可以被用在任何可以使用内建函数的地方.例如,可以创建复杂条件的计算函数并且后面用它们来 ...

  8. js 给服务器发消息,的Node.js:发送消息至服务器

    我有我的服务器上运行以下的node.js:的Node.js:发送消息至服务器 var net=require('net'); var util=require('util'); var server= ...

  9. appollo消息服务器,Springboot 集成 MQTT —— web 服务端实现(apollo 客户端)-Go语言中文社区...

    基于 MQTT 可以实现很多场景,例如现在使用比较多的物联网,还有消息的实时推送.联网的设备连接上 apollo 服务器以后,一直监听 apollo 推送过来的信令/消息即可. 1.web 服务端向联 ...

  10. python 消息 推送服务器,从客户端发送字符串消息到服务器Python

    我无法运行我的代码,只要我将这些发送线添加到客户端和服务器中的recv行.我不知道什么是错的.没有他们,程序运行完美.我为了便于调试而粘贴了尽可能小的代码,因为如果没有这些代码,代码是完美的.从客户端 ...

最新文章

  1. bitset类型, 标准库类型
  2. c语言实现字符串中提取数字,遇到非字符串则换行
  3. 服务器查看gpu状态_如何查看服务器gpu
  4. 如果Laravel 报错 file_put_contents(): failed to open stream
  5. nginx 重定向_虚拟机中安装nginx,重定向到resin
  6. vuecli启动的服务器位置,在vue cli 3生成的项目中启动dev服务器
  7. matlab破损皮革定位,matlab-code-of-TDOAFDOa 干扰源定位代码,应该在 的求解过程中有帮助。 276万源代码下载- www.pudn.com...
  8. 给1-3年的前端 6 点诚心建议
  9. Hibernate的批量处理-批量更新
  10. WPF入门教程系列二十——ListView示例(二)
  11. linux常见的三种shell,几种常见的Shell
  12. 没有电脑却想运行代码?有手机就够了
  13. %appdata% 代表什么?
  14. 做视频直播时如何测试本地网络的上行带宽(网速测试)
  15. Java Instrument 功能使用及原理
  16. MFC银行卡卡号验证程序
  17. 基于51单片机的gps定位系统
  18. NR系统概述-架构与演进
  19. 虚拟滚动列表和css虚拟滚动【有思考】
  20. 一个小垃圾的成长笔记

热门文章

  1. OSPF基础配置命令
  2. 生产订单管理系统软件哪家好?
  3. 蓝海灵豚医疗器械管理软件医用耗材专版
  4. python一帧一帧读取视频_如何使用openCV和python从流中逐帧获取视频
  5. 用pod安装swiftyJson的一个实例
  6. 65nm工艺下MOM电容详解与蒙特卡洛仿真及calibre xRC
  7. 7天连锁酒店郑南雁:顺势创业者无为管理人
  8. 综合评价法之秩和比法(RSR)
  9. 下载的java游戏怎么运行不了_不支持JAVA的手机如何下载运行游戏和QQ
  10. Windows Server 2016 安装IIS