一.需求

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

二.解决方案

核心思想: 在服务器端,需保存不同客户端的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. cin.clear()、cin.sync()

    看机器学习时,发现之前学的C++代码忘了,cin.clear().cin.sync() cin.clear():将流中的所有状态值都重设为有效值 cin.sync():清空流 这个很有意思,如果没有c ...

  2. python3.7--pycharm selenium自启360浏览器/360极速浏览器方法

    写于:2019.01.02(实测日) 参考文档:https://blog.csdn.net/five3/article/details/50013159 一.下载360浏览器或360极速浏览器的Chr ...

  3. Iterator(遍历器) 和 for...of 循环

    是generator的前置知识 generator :https://www.cnblogs.com/wangtong111/p/11322961.html 遍历器(Iterator)就是这样一种机制 ...

  4. 阿里菜鸟知识储备之二——git工具学习

    具体的可以参见这篇博客: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 1,什么 ...

  5. Oracle诊断:drop table失败[转]

    转: From <http://blog.csdn.net/cyxlxp8411/article/details/7775113> 今天在drop一张表的时候报ORA-00054错误 SQ ...

  6. 进程间通信(IPC)-管道、匿名管道

    每个进程都有各自的地址空间,任何一个进程的全局变量在另一个进程中都看不到 所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读 ...

  7. @清晰掉 GDB调试器中的战斗机

    GDB 的命令很多,本文不会全部介绍,仅会介绍一些最常用的.在介绍之前,先介绍GDB中的一个非常有用的功能:补齐功能.它就如同Linux下SHELL中的命令补齐一样.当你输入一个命令的前几个字符,然后 ...

  8. 什么是webpack以及为什么使用它

    什么是webpack以及为什么使用它 新建 模板 小书匠  在ES6之前,我们要想进行模块化开发,就必须借助于其他的工具.因为开发时用的是高级语法开发,效率非常高,但很可惜的是,浏览器未必会支持或认识 ...

  9. windows下eclipse打不开

    报错找不到jre等东西 因为eclipse到不到javaw.exe 将其写入eclipse.ini即可 在eclipse.ini的前面加上 -vm D:\dev_tool\java\jdk1.7.0_ ...

  10. OpenStack 实现技术分解 (6) 通用库 — oslo_log

    目录 目录 前文列表 扩展阅读 日志级别 oslolog 初始化设置 DEMO oslolog 的相关配置项 oslolog 的日志级别 oslolog 的使用技巧 推荐使用 LOGdebug 的地方 ...