请问用socket实现广播,客户端怎么监听啊

问题描述

我看网上的代码都是用GUI或者多线程做的,如果不这样可以做吗?这个是我客户端的代码,一直收不到消息,不知道问题在哪啊?可以有人帮我改一下吗?谢谢了!public class SocketClient{ static Socket server; public static void main(String[] args)throws Exception{ server=new Socket(InetAddress.getLocalHost(),5678); BufferedReader wt=new BufferedReader(new InputStreamReader(System.in)); PrintWriter out=new PrintWriter(server.getOutputStream()); BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream())); while(true) { while(in.readLine()==null){ String str=wt.readLine(); out.println(str); out.flush(); System.out.println(in.readLine()); } String str=in.readLine(); System.out.println(in.readLine()); server.close(); } } } 问题补充:deepfuture 写道

解决方案

服务器端其实也用到了多线程了的,这里其实就是为每一个客户端开一个单独的线程来处理。SocketThread mulserver = new SocketThread(ss, list);System.out.println("The number of clients is: " + count);mulserver.start();如果不用多线程的话,readLine操作就会被阻塞,在客户端的体验就是:等待服务器发来一行消息,然后才能继续读取键盘输入的文字;或者是等待键盘敲回车,才能继续读取服务器过来的下一行消息。你后来贴的代码貌似没看到receive方法的调用哦。在你初始化完了GUI和网络以后,可以在主线程里调用receive()方法。因为swing里会启动后台线程来监听你对界面到动作,响应界面事件,主线程的阻塞不会影响到界面的响应。我贴一下我根据你的思路写的一个简单的控制台客户端,仅用来说明我前面讲的思路,希望能对你有帮助~public class SocketClient {private Socket server;private BufferedReader wt = null;public void startClient() {try {server = new Socket(InetAddress.getLocalHost(), 5678);wt = new BufferedReader(new InputStreamReader(System.in));PrintWriter out = new PrintWriter(server.getOutputStream());new ClientReadThread(server.getInputStream()).start();String line = null;while ((line = wt.readLine()) != null) {out.println(line);out.flush();}} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) throws Exception {new SocketClient().startClient();}}public class ClientReadThread extends Thread {private BufferedReader reader = null;public ClientReadThread(InputStream in) {reader = new BufferedReader(new InputStreamReader(in));}public void run() {String line = null;try {while((line = reader.readLine()) != null) {System.out.println("recv:" + line);}} catch (IOException e) {e.printStackTrace();}}}
解决方案二:
你是不是想实现这么一个效果呢,一个客户端发消息,所有的客户端都能收到?客户端需要处理两个读操作,一个从键盘读取,一个从socket读取。这两个读操作都会阻塞等待输入。要实现一边显示接收的信息,一边发送消息到话,需要在客户端开两个线程。主线程从键盘读取,输出到socket;另外一个线程负责从socket读取,输出到控制台。另外在服务器端,一个客户端连接关掉以后,需要把这个连接从list里删除,以免继续对这个连接广播消息。
解决方案三:
你可以使用tcpdump或windump在客户端检测一下,看是否收到了相关包,你可以查找到原因
解决方案四:
应该是在服务器端维护一个连接上来的客户端的socket列表,广播的时候遍历这个列表,逐一发送。单从客户端代码看,感觉in.readLine()调的不合理,好几个地方只读取,不打印,可能漏掉了你想看到的信息。顺便也把你的代码也贴上来吧~:)
解决方案五:
是不是要用组播啊
解决方案六:
http://baike.baidu.com/view/473043.htm广播地址
解决方案七:
网络有广播地址的。。。Broadcast Address(广播地址)是专门用于同时向网络中所有工作站进行发送的一个地址。在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的IP 地址为广播地址,广播的分组传送给host ID段所涉及的所有计算机。例如,对于10.1.1.0 (255.255.255.0 )网段,其广播地址为10.1.1.255 (255 即为2 进制的11111111 ),当发出一个目的地址为10.1.1.255 的分组(封包)时,它将被分发给该网段上的所有计算机。

时间: 2024-10-19 02:13:53

请问用socket实现广播,客户端怎么监听啊的相关文章

请问下安卓接收消息,不用广播用事件监听怎么实现啊?demo里有例子吗?

问题描述 请问下安卓接收消息,不用广播用事件监听怎么实现啊?demo里有例子吗? 解决方案 看下ChatDemoUI的DemoHXSDKHelper类,MainActivity类,以及chatActivity类,都有onEvent方法,3.0demo的话看下DemoHeleper类解决方案二:http://docs.easemob.com/doku.php?id=start:200androidcleintintegration:40broadcastreceiver#回调监听事件注册

Android广播接实现监听电话状态(电话的状态,拦截)_Android

首先我们来理解下监听器的机制. Android的事件处理机制有两种:监听和回调. A基于监听的事件处理 主要涉及三类对象:EventSource(事件源),Event(事件),EventListener(事件监听器) 监听机制处理事件的流程图如下(委派式:Delegation): 1:需要在AndroidManifest.xml清单中添加权限 <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS&q

请问,在Rails应用中 如何 监听Startup 和Shutdown?

问题描述 请问,在Rails应用中 如何 监听Startup 和Shutdown?就像在 java web应用中使用servlet 的 listener一样,我需要在 Rails 中 监听 应用的启动和关闭,请问应该怎么实现呢?我知道,把一个 .rb文件 放在 APPconfiginitializers 目录下,Rails启动时会自动运行它,权且当这是 监听应用Startup的方法吧,那么 Shutdown 呢?在开发模式下,我总是 使用 Ctrl + C 结束 Rails应用, 我不知道 有什

Android广播接实现监听电话状态(电话的状态,拦截)

首先我们来理解下监听器的机制. Android的事件处理机制有两种:监听和回调. A基于监听的事件处理 主要涉及三类对象:EventSource(事件源),Event(事件),EventListener(事件监听器) 监听机制处理事件的流程图如下(委派式:Delegation): 1:需要在AndroidManifest.xml清单中添加权限 <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS&q

请问服务端rest api怎样实现监听接收到来自客户端的消息

问题描述 现在有个场景应用如下:1.客户端app发送消息后需要在服务端接收到消息然后,通过服务端内部业务逻辑流程处理后向该客户端做响应发送消息处理.我看了下目前服务端的rest api服务接口只有发送消息的接口,请问是否有接收消息的接口,如果没有,要怎么实现这个场景应用?rest接口是哪个接口??rest接口是哪个接口??rest接口是哪个接口??rest接口是哪个接口??rest接口是哪个接口??rest接口是哪个接口??rest接口是哪个接口??rest接口是哪个接口??rest接口是哪个接

请问有没有接受离线消息的监听啊

问题描述 解决方案 还有,我用文档方法2处理头像和昵称,我是在EMClient.getInstance().chatManager().addMessageListener(msgListener); EMMessageListener msgListener = new EMMessageListener() {的回调里收到消息后,得到扩展字段,然后和数据库头像昵称比较,改变了就更新数据库,没有就加入数据库,然后在聊天界面上头像昵称就访问数据库取出再赋值,但是这个消息回调接口没有返回离线消息,

c#socket 广域网服务器监听地址问题

问题描述 请问广域网中c#socket服务器端监听地址和端口怎么写?仍然是127.0.0.1吗?客户端怎么写呢?假设我服务器端PC是连在一个路由器A上的电脑,服务器端PC分配的路由器A地址为192.168.1.114,路由器A分配到的公网地址是自动获取的为172.16.7.218,网关1.1.1.2,客户端的电脑是链接的另一个路由器B,客户端PC分配的路由器B地址为192.168.1.3,路由器B获取的公网地址为134.122.5.23,网关未知,两个路由器不在一个网络内.请问这时候写C#soc

PHP监听Socket

<?phpset_time_limit(10);$commonProtocol = getprotobyname("tcp");$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);if ($socket) {$result = socket_bind($socket, 'localhost', 1337);if ($result) { $result = socket_listen($socket, 5);

android屏幕加解锁事件广播的监听

想在程序中监听屏幕SCREEN_ON和SCREEN_OFF这两个action,实现屏幕锁定状态的监听,从而实现自己的相应功能.比较奇怪的是这两个action只能通过代码的形式注册才能被监听到,在AndroidManifest.xml中注册根本监听不到.去网上查了一下,原来是PowerManager那边在发这个广播的时候做了限制,限制只有register到代码中的receiver才能接收.特此记录! public class ScreenActionReceiver extends Broadca