从基本服务器向特定客户端发送消息

3
我有两个WiFi模块M1和M2,它们连接到我的接入点。我有一部连接到相同接入点的安卓手机。我在我的安卓手机上有一个套接字服务器,这两个模块作为客户端加入到服务器中。现在我的问题是,是否可以在不发送任何东西到M2的情况下,从我的手机向模块M1发送字符串消息。我想选择客户端来发送消息。这在Java中是否可能?
//setting up server
ServerSocket serverSocket = new ServerSocket(8000, 0, IPaddress);

//creating a client socket to accept it
Socket clientSocket = serverSocket.accept();

现在,我在单独的线程中接受客户端,以免主线程因 accept() 函数阻塞而冻结。
我不知道如何在每次新客户端连接时创建一个新线程。此外,我也不知道如何限制可以连接的客户端数量。我最多需要5个客户端,不再多。
1个回答

2
是的,这是可能的。您需要为每个客户端维护一个单独的连接。ServerSocket类有一个accept()函数,它返回一个Socket对象。该对象表示两个点之间的连接,即您的服务器和一个客户端。您可以在循环中多次调用ServerSocket.accept()来接受所有传入连接。返回的每个Socket对象都将是不同客户端的。
为了使服务器向特定客户端发送消息,它需要知道哪个套接字属于哪个客户端,因此客户端将必须向服务器发送一些消息以确定其身份,服务器将需要读取和解释该消息。然后,它可以使用适当的响应回应该特定客户端。
如果您仍然遇到问题,请发布您的代码。
更新:因为您在问题中添加了代码,请参阅Android文档关于创建线程的内容。这将比stackoverflow上的帖子更详细。
至于接受连接和启动线程,只需在循环中执行即可。
for(int i = 0; i<5; i++){
    clientSocket = serverSocket.accept();
    // start a new thread, passing it the clientSocket as an argument
}

其他可能有用的链接: https://developer.android.com/resources/articles/painless-threading.html https://developer.android.com/guide/topics/fundamentals/processes-and-threads.html

哇,你简直是个天才。我自己没法用比这更好的方式表达出来。我知道这是可能的,只是不知道如何实现。我有我的代码,但我不知道如何在这里发布。当我复制并粘贴时,显示的是垃圾信息。我该怎么像其他人一样在Stack Overflow上发布代码? - David Norman
在你的代码每一行前面加上4个空格。{}按钮位于您编辑帖子时的上方,将尝试自动执行此操作,但它并不总是有效。在您的帖子编辑框下方有一个预览。另外,如果我的答案解决了您的问题,请随意点击旁边的勾选标记以表示问题已解决,并给我一个正确答案的奖励。 - kaz
好的,你是个不错的人。我会试一下的。15分钟后回来给你一些代码。 - David Norman
我不确定,但有人删除了我的名为“Update 2”的帖子。无论如何,我已经完成了这个任务,但仍然能够向最后连接的客户端发送消息。好的,另一个问题是,如果没有服务器-客户端通信,我能否做类似的事情。我的手机和两个模块都连接到我的局域网接入点。是否有一种方法可以使用从路由器获取的IP地址从我的手机发送消息到任何一个模块? - David Norman
这确实是一个不同的问题,需要在不同的StackExchange网站上讨论。但是你的主机(连接到你的局域网的任何计算机,如桌面电脑、笔记本电脑或手机)需要运行一个服务器来侦听传入的消息。在Linux上,openSSH是一个很好且安全的工具,ssh协议可以在几乎所有现代操作系统上使用。如果你的代码发送消息到错误的客户端有困难,那么请发布代码,我们将帮助你找到原因。 - kaz
甜蜜的AZ KAZ。我正在考试期间,无法在代码方面取得任何进展。我将于星期二恢复我的项目。此外,所谓的模块是指WiFi模块。我订购了两个WiFi模块,并尝试将其连接到家中的两个电器上。我想使用手机开关这些电器的开/关。 - David Norman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接