一.需求

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

二.解决方案

核心思想: 在服务器端,需保存不同客户端的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 class Run {
private final static int PORT = ;
public static HashMap<String, Socket> socketList = new HashMap<>();
public static String channelToken; //socket 令牌
private static BufferedReader bufferedReader; public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(PORT);
System.out.println("server is listenning...");
while(true){//不断循环随时等待新的客户端接入服务器
Socket clientSocket = server.accept();
bufferedReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
channelToken = bufferedReader.readLine();
socketList.put(channelToken,clientSocket); //保存会话ID和socket
//System.out.println(socketList.get(channelToken));
//System.out.println(socketList);
new ServerThread(clientSocket,socketList);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package server;

import java.io.*;
import java.net.*;
import java.util.*; public class ServerThread extends Thread{
private Socket client;
private PrintWriter out;
private HashMap<String, Socket> clientList = new HashMap<>(); public ServerThread(Socket socket,HashMap<String, Socket> socketList) throws IOException{
super();
client = socket;
clientList = socketList; start();
} @Override
public void run(){
Socket socket;
System.out.println("Client: "+getName()+" come in..."); //每当客户端连接上,就向相应的客户端进行回应
Iterator<HashMap.Entry<String, Socket>> entries = clientList.entrySet().iterator();
while (entries.hasNext()){
HashMap.Entry<String, Socket> 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-
import socket
import threading HOST = "localhost"
PORT = sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT)) def test():
socketID = 'I am 111'
sock.sendall((socketID+'\r').encode())
while True:
data = sock.recv().decode()
print('from line: '+data)
sock.close() if __name__ == '__main__':
test()
#coding = utf-
import socket
import threading HOST = "localhost"
PORT = sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
def test():
socketID = 'I am 000'
sock.sendall((socketID+'\r').encode())
while True:
data = sock.recv().decode()
print('from line: '+data)
sock.close() if __name__ == '__main__':
test()

四.总结

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

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

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

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

参考文献

  1. java socket编程中,如何让服务器主动向指定ip地址的客户端发送信息
  2. socket 服务器给指定的客户端发消息该怎么处理
  3. socket 服务器给指定的客户端发消息该怎么处理

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

作者:Deen12520

来源:CSDN

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

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

socket 服务器向指定的客户端发消息的更多相关文章

  1. netty04(重点来了、指定某个客户端发信息或者群发)小声嘀咕~~我也是从零开始学得、、、想学习netty的又不知道怎么下手的童鞋们~~

    还是和上几篇一样,先给出前面笔记的连接,有没看的可以去看看再来! netty01   . netty02  .netty03 看到这里.你基本上可以使用netty接受信息和根据对应的信息返回信息了 接 ...

  2. node.js中express模块创建服务器和http模块客户端发请求

    首先下载express模块,命令行输入 npm install express 1.node.js中express模块创建服务端 在js代码同文件位置新建一个文件夹(www_root),里面存放网页文 ...

  3. 循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)

    目录[-] 一.TCP/IP协议 二.TCP与UDP 三.Socket是什么 四.Java中的Socket 五.基本的Client/Server程序 六.多客户端连接服务器 七.信息共享 八.文件传输 ...

  4. 循序渐进Socket网络编程(多客户端、信息共享、文件传输)

    循序渐进Socket网络编程(多客户端.信息共享.文件传输) 前言:在最近一个即将结束的项目中使用到了Socket编程,用于调用另一系统进行处理并返回数据.故把Socket的基础知识总结梳理一遍. 1 ...

  5. 二、网络编程-socket之TCP协议开发客户端和服务端通信

    知识点:之前讲的udp协议传输数据是不安全的,不可靠不稳定的,tcp协议传输数据安全可靠,因为它们的通讯机制是不一样的.udp是用户数据报传输,也就是直接丢一个数据包给另外一个程序,就好比寄信给别人, ...

  6. Spring Boot+Socket实现与html页面的长连接,客户端给服务器端发消息,服务器给客户端轮询发送消息,附案例源码

    功能介绍 客户端给所有在线用户发送消息 客户端给指定在线用户发送消息 服务器给客户端发送消息(轮询方式) 项目搭建 项目结构图 pom.xml <?xml version="1.0&q ...

  7. java Socket通信,客户端与服务端相互发消息

    1.通信过程 网络分为应用层,http.ssh.telnet就是属于这一类,建立在传输层的基础上.其实就是定义了各自的编码解码格式,分层如下: 2.Socket连接 上述通信都要先在传输层有建立连接的 ...

  8. NIO【同步非阻塞io模型】关于 NIO socket 的详细总结【Java客户端+Java服务端 + 业务层】【可以客户端间发消息】

    1.前言 以前使用 websocket来实现双向通信,如今深入了解了 NIO 同步非阻塞io模型 , 优势是 处理效率很高,吞吐量巨大,能很快处理大文件,不仅可以 做 文件io操作, 还可以做sock ...

  9. java socket 一个服务器对应多个客户端,可以互相发送消息

    直接上代码,这是网上找的demo,然后自己根据需求做了一定的修改.代码可以直接运行 服务器端: package socket; import java.io.BufferedReader; impor ...

随机推荐

  1. ubuntu16虚拟机迁移/移动/复制后无法上网

    修改grub配置 如果没有网卡,需要配置 sudo vi /etc/default/grub 将 GRUB_CMDLINE_LINUX="" 修改为 GRUB_CMDLINE_LI ...

  2. legend2---lamp.sh一键安装lamp环境需要爬的坑

    legend2---lamp.sh一键安装lamp环境需要爬的坑 一.总结 一句话总结: 1.要记得更改项目权限:chown -R apache:apache /data/www/default/网站 ...

  3. npm-package-lock.json

    npm notice created a lockfile as package-lock.json. You should commit this file. https://docs.npmjs. ...

  4. 微信小程序 API 界面 (2)

    由于每个 API 参数:对象的属性都有 success,fail,complete,所以在这个提前介绍,就不再每个API 上写了 success:类型 函数 接口调用成功的回调函数 fail:类型 函 ...

  5. xsens melodic ros driver

    sudo apt-get update sudo apt-get install ros-melodic-xsens-driver 设置数据输出: // 输出四元数,加速度.角速度.地磁 python ...

  6. eclipse下 hibernate逆向数据库操作示例!!

    做项目必然要先进行数据库表设计,然后根据数据库设计建立实体类(VO),这是理所当然的,但是到公司里做项目后,让我认识到,没有说既进行完数据库设计后还要再“自己”建立一变VO.意思是,在项目设计时,要么 ...

  7. pg和mysql对比

    作者:方圆链接:https://www.zhihu.com/question/20010554/answer/15863274来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  8. Babel编译:类继承

    编译前 // 父类 class Fruit { static nutrition = "vitamin" static plant() { console.log('种果树'); ...

  9. 动态网页基础——JSP

    WEB项目的目录结构 META-INT  WEB-INF 对外都是不可访问的,不可把index.jsp/index.html 放这 JSP JSP是为了简化Servlet的工作出现的替代品,Servl ...

  10. database 学习

    ref : 什么是NoSQL,为什么要使用NoSQL?