socket 服务器向指定的客户端发消息
一.需求
需求如题. 当多个客户端连接服务器时,服务器如何给指定的客户端发送消息.
二.解决方案
核心思想: 在服务器端,需保存不同客户端的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 服务器向指定的客户端发消息,网上给的资源不多,大多是关于服务器群发. 这里给出了具体解决方案,并通过实例证实了该方案的可行性.
有时看的资料越多,越不明白.这并总是好事.
这个时候就需要静下来理理思路,然后针对具体的解决方案,编程实现.
实践才是检验真理的唯一标准,设计代码的时候你就离成功又近了一步.
参考文献
---------------------
作者:Deen12520
来源:CSDN
原文:https://blog.csdn.net/dingding_12345/article/details/72790839
版权声明:本文为博主原创文章,转载请附上博文链接!
socket 服务器向指定的客户端发消息的更多相关文章
- netty04(重点来了、指定某个客户端发信息或者群发)小声嘀咕~~我也是从零开始学得、、、想学习netty的又不知道怎么下手的童鞋们~~
还是和上几篇一样,先给出前面笔记的连接,有没看的可以去看看再来! netty01 . netty02 .netty03 看到这里.你基本上可以使用netty接受信息和根据对应的信息返回信息了 接 ...
- node.js中express模块创建服务器和http模块客户端发请求
首先下载express模块,命令行输入 npm install express 1.node.js中express模块创建服务端 在js代码同文件位置新建一个文件夹(www_root),里面存放网页文 ...
- 循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)
目录[-] 一.TCP/IP协议 二.TCP与UDP 三.Socket是什么 四.Java中的Socket 五.基本的Client/Server程序 六.多客户端连接服务器 七.信息共享 八.文件传输 ...
- 循序渐进Socket网络编程(多客户端、信息共享、文件传输)
循序渐进Socket网络编程(多客户端.信息共享.文件传输) 前言:在最近一个即将结束的项目中使用到了Socket编程,用于调用另一系统进行处理并返回数据.故把Socket的基础知识总结梳理一遍. 1 ...
- 二、网络编程-socket之TCP协议开发客户端和服务端通信
知识点:之前讲的udp协议传输数据是不安全的,不可靠不稳定的,tcp协议传输数据安全可靠,因为它们的通讯机制是不一样的.udp是用户数据报传输,也就是直接丢一个数据包给另外一个程序,就好比寄信给别人, ...
- Spring Boot+Socket实现与html页面的长连接,客户端给服务器端发消息,服务器给客户端轮询发送消息,附案例源码
功能介绍 客户端给所有在线用户发送消息 客户端给指定在线用户发送消息 服务器给客户端发送消息(轮询方式) 项目搭建 项目结构图 pom.xml <?xml version="1.0&q ...
- java Socket通信,客户端与服务端相互发消息
1.通信过程 网络分为应用层,http.ssh.telnet就是属于这一类,建立在传输层的基础上.其实就是定义了各自的编码解码格式,分层如下: 2.Socket连接 上述通信都要先在传输层有建立连接的 ...
- NIO【同步非阻塞io模型】关于 NIO socket 的详细总结【Java客户端+Java服务端 + 业务层】【可以客户端间发消息】
1.前言 以前使用 websocket来实现双向通信,如今深入了解了 NIO 同步非阻塞io模型 , 优势是 处理效率很高,吞吐量巨大,能很快处理大文件,不仅可以 做 文件io操作, 还可以做sock ...
- java socket 一个服务器对应多个客户端,可以互相发送消息
直接上代码,这是网上找的demo,然后自己根据需求做了一定的修改.代码可以直接运行 服务器端: package socket; import java.io.BufferedReader; impor ...
随机推荐
- Anaconda安装PyTorch
Anaconda是一个Python语言管理器,支持安装基于Python的开发包,例如tensorflow.Pytorch等,以及各种基于Python的IDE. https://www.jb51.net ...
- nowcoder---常州大学新生寒假训练会试----F 大佬的生日礼包(二分)
链接:https://www.nowcoder.net/acm/contest/78/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit ...
- python双划线类型
通过__开始的属性感觉分为两种类型: 利用dir调用的时候: < build in x object at 0x01F116B0>:这种貌似和运算符重载有关系,用户如果需要的话可以重写该函 ...
- layui 获取select option value 获取text
$.trim($("#processState").val()): //获取val $("#processState option:selected").tex ...
- MongoDB通过JavaDriver执行shell命令,例如创建sharding collection
Mongodb的java driver本身的接口 void createCollection(String collectionName, CreateCollectionOptions create ...
- 后盾网lavarel视频项目---1、数据迁移
后盾网lavarel视频项目---1.数据迁移 一.总结 一句话总结: 1.lavarel的数据迁移比较简单,就是用php来创建数据表 2.创建迁移文件:php artisan make:migrat ...
- webrtp官方demo运行
Google官方提供的webrtc的demo对应的网站是https://webrtc.github.io/samples/ 上面的DEMO对我这种入门的人很有用,用chrome浏览器最新的版本直接可以 ...
- leetcode-mid-backtracking -22. Generate Parentheses-NO
mycode 没有思路,大早上就有些萎靡,其实和上一个电话号码的题如出一辙啦 参考: class Solution(object): def generateParenthesis(self, ...
- Linux下去掉^M方法
由于windows和Linux文件格式不同,windows下文件在Linux下行尾会有^M 去掉^M方法 sed -i ‘s/^M//g' filename #注意:^M的输入方式是 Ctrl + v ...
- PARAMETERS对象
1. PARAMETERS的基本语法及定义 PARAMETERS可以参照数据字典字段或自定义数据类型创建文本输入域及单选框/复选框等, PARAMETERS只能创建一个单一的输入域且最多只能输入行,其 ...