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

我看网上的代码都是用GUI或者多线程做的,如果不这样可以做吗?这个是我客户端的代码,一直收不到消息,不知道问题在哪啊?可以有人帮我改一下吗?谢谢了!
[code="java"]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();
                      }                  
             }
       }[/code]

7个回答

服务器端其实也用到了多线程了的,这里其实就是为每一个客户端开一个单独的线程来处理。
[code="java"] SocketThread mulserver = new SocketThread(ss, list);
System.out.println("The number of clients is: " + count);
mulserver.start();[/code]

如果不用多线程的话,readLine操作就会被阻塞,在客户端的体验就是:等待服务器发来一行消息,然后才能继续读取键盘输入的文字;或者是等待键盘敲回车,才能继续读取服务器过来的下一行消息。

你后来贴的代码貌似没看到receive方法的调用哦。在你初始化完了GUI和网络以后,可以在主线程里调用receive()方法。因为swing里会启动后台线程来监听你对界面到动作,响应界面事件,主线程的阻塞不会影响到界面的响应。

我贴一下我根据你的思路写的一个简单的控制台客户端,仅用来说明我前面讲的思路,希望能对你有帮助~

[code="java"]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();

}

}[/code]

[code="java"]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();
    }
}

}[/code]

网络有广播地址的。。。
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 的分组(封包)时,它将被分发给该网段上的所有计算机。

是不是要用组播啊

应该是在服务器端维护一个连接上来的客户端的socket列表,广播的时候遍历这个列表,逐一发送。
单从客户端代码看,感觉in.readLine()调的不合理,好几个地方只读取,不打印,可能漏掉了你想看到的信息。顺便也把你的代码也贴上来吧~:)

你可以使用tcpdump或windump在客户端检测一下,看是否收到了相关包,你可以查找到原因

你是不是想实现这么一个效果呢,一个客户端发消息,所有的客户端都能收到?
客户端需要处理两个读操作,一个从键盘读取,一个从socket读取。这两个读操作都会阻塞等待输入。要实现一边显示接收的信息,一边发送消息到话,需要在客户端开两个线程。主线程从键盘读取,输出到socket;另外一个线程负责从socket读取,输出到控制台。

另外在服务器端,一个客户端连接关掉以后,需要把这个连接从list里删除,以免继续对这个连接广播消息。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
请问怎么通过socket广播啊?
想用socket向客户端广播消息,应该怎么做啊?
用socket,请问怎么实现????????????
请问我用ClientSocket,和ServerSocket,我想实现以下功能?rn当我的程序检测不到网卡,时显示你的机器没有安装网卡,请问怎么实现?
Socket监听的多线程怎么实现?
用Socket监听有没有其他Socket请求连接,rn如果不用多线程,rn一开始监听就堵塞,rn整个UI就死了,rn只有用多线程才能实现在监听的同时还可以操作UI吧?rn具体应该怎么实现呢?
socket实现广播和客户端到客户端的通信
通过Socket和多线程实现广播和客户端到客户端的通信,私聊时有离线消息。 1.服务器端 [code="java"] package com.gjy.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.i...
用socket实现聊天室,怎么实现客户端与客户端之间的对话?
我的想法是,所有要传送的消息都经过服务器中转一次!但是,现在的问题是,怎么区分开各个客户端!比如,有5个客户端A,B,C,D,E,对应有5个socket,a,b,c,d,e,如果,由客户端B发送消息给C,服务器怎么从这五个客户端的socket中找出客户端C的socket呢?rn我考虑过,建立又一个结构储存没个客户端的标示,SOCKET等信息!rn不知道有没有现成的结构或者类阿?????rn或者有什么更好的方法解决?
如何实现SOCKET广播?
发送,接受端各要作些什么?调用哪些函数?要不要连接?rn最好能给一段用CAsyncSocket的代码
UDP广播socket实现
UDP广播:const int MAX_BUF_LEN = 255; int main(int argc, char* argv[]) { WORD wVersionRequested; WSADATA wsaData; int err; // 启动socket api wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersion
怎么用socket发广播消息?
我想用socket的UDP协议写一个能发送广播消息的程序,rn我看MSDN上写将SendTo函数的lpszHostAddress参数设成NULL就可以发广播了,可是接收端的ReceiveFrom的参数应该怎么写呀,我研究了半天没研究出来,望高手指点.
广播监听
安卓广播监听(权限+实现+注册) 1 .添加接收开机广播的权限 2.编写广播接收器 public class open_receiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent1) {        //此处填写接
监听广播
 1.BroadcastReceiver用来接收sendBroadcast()方法发出来的广播,可以通过Intent传递数据,它是一个抽象类2、广播特点:数据的传递方向是单向的,调到固定的频率3、安卓的广播作用范围有限,只在当前手机里有效4、系统把一些重要的操作,通过广播的形式通知给所有的应用广播接受者案例1、 IP拨号器1. 写一个类继承BroadcastReceiver,重写onReceive...
socket 作为服务器端,监听客户端
支持多个socket连接,并同时监听,支持连接断开后,socket释放等。
用SOCKET监听端口
有没有具体得代码rnrn我要监听80端口rnrnrn看看别人POST什么过来rn
怎么用Socket实现一个HTTP服务器啊?
希望有实例
广播接收实现网络状态监听
本课程主要分为从九个章节完成,学习完本系列课程后,学员将会在Android开发方面整体上有一个较大的提升,对Android开发体系和开发技术有更深层次的理解,能从基本的开发者进入到一个较高水平的开发者。学习完本课程,能够进行使用JNI技术进行NDK开发,对Android应用有一定的性能优化能力,对技术的钻研能力能够增强,独立解决技术难点的能力有较大提升。
Socket怎么在客户端一直监听Socket服务器的端口号
我现在的问题是, 我向服务器端口8881广播了一个数据,服务器那边也收到了我的数据,然后服务器那边已8880的端口返回了一个数据给我,因为如果以8881端口返回的数据还是我自己发送过去的数据。  所以服务器那边是以8880的端口返回数据给我这边。 问题是:我在客户端这边应该怎么接收呢。
请问用socket post网页上传文件怎么实现啊????
现找到如下例子方法,但不能上传成功:rnPOST /Upload.ashx?parameter1=010&parameter=2&param=3 HTTP/1.1rnCache-Control: no-cachernConnection: closernHost: [url]www.myhost.com[/url]rnAccept: */*rnContent-Length: 61585rnContent-Type: multipart/form-data; boundary=--158046840414746426rn--158046840414746426rnContent-Disposition: form-data; name="file" ;filename="file.APK"rnContent-Type: apk\r\nrn这里接着为file.APK的文件内容rn这个内容怎么写啊?????apk文件的具体内容也取不出来啊
Socket的原理:监听socket和传输socket是怎么实现的
一直在想tcpsocket多线程的原理,想不通监听socket和传输socket是怎么工作的。rnrn我们知道服务器socket为了能够同时服务多个客户端,在主socket监听到客户端A接入请求时accept会产生一个新的socket(用rnrnSocketA标记)用于和客户端A通信,并且这个socket的LocalPort和主socke端口是一样的。然后又有一个客户端B请求连接,主rnrnsocket监听到后accept,这样又产生一个一个新的socket(用SocketB标记),用于和客户端B通信,并且SocketB的本地端口和rnrn主socket、SocketA的都一样。这时问题就来了:当客户端A发送信息过来,服务器接收到此消息后是怎么把它给SocketA的,而rnrn不是SocketB?具体把消息发给谁不是用端口号区分的吗,那么SocketA,和SocketB又是怎么区分的?rnrn望高手指教!
socket服务器代码怎么实现自动监听?
void Getlisten()rn rn //开始监听rn tryrn rn ip = IPAddress.Parse(CommAddress.Text);rn rn catchrn rn MessageBox.Show("您输入的IP地址格式不正确,请重新输入!");rn rn tryrn rn Thread thread = new Thread(new ThreadStart(Server));rn thread.Start();rn rn catch (Exception ee)rn rn Statelsb.Items.Add(ee.ToString());rnrn rn
socket广播校验和怎么计算?
我用udp校验和的函数来实现,怎么不对?rn该udp校验和的函数计算的值在udp通信中是正确的。
windows网络编程socket选项与广播的实现
调用getsockopt和setsocketopt可以查看和设置socket中的一些选项,比如socket是否处于监听状态,是否允许广播,是否允许路由选择等等。 1.getsockopt() int getsockopt(SOCKET s,int level,int optname, char* optval, int* optlen) s:要查看的套接字 level:选项的级别,有SOL
socket中如何实现广播?
最近开始学socket编程,不知道如何实现广播,请大侠指教rnrn谢谢
Socket之广播
介绍 本文介绍如何使用Java、Python等语言实现数据广播。 java   python  查看原文:http://surenpi.com/2015/08/26/socket%e4%b9%8b%e5%b9%bf%e6%92%ad/
请问怎么用SOCKET发邮件
请问怎么用SOCKET发邮件 麻烦哪位大哥给个WIN32汇编的代码给我参考下。
两天了,急死了,广播dhcp客户端请求,用的socket总是不行
我想模拟dhcp的客户端,广播ip请求包,看网络内是否有dhcp服务器,用socket实现的,rn源0.0.0.0,目的是255.255.255.255,可发的包用sniffer抓一下,根本不对,程序也收不到返回包,改网络配置,自动获取ip用sniffer一抓,倒是正确的很,哎,大家看看我的代码,或有什么好办法吗?!rnrn bool optval=true;rn SOCKET s;rn SOCKADDR_IN in;rn int errno;rnrn if((s=socket(AF_INET,SOCK_DGRAM,17))==INVALID_SOCKET)rn rn //失败;rn rnrn in.sin_family=AF_INET;rn in.sin_addr.s_addr=INADDR_ANY;//这里我定义的是0.0.0.0,却成了本机的ip地址rn in.sin_port=68;//端口用sniffer抓的时候,应该是0044,却变成了4400rnrn if(bind(s,(LPSOCKADDR)&in,sizeof(in)))rn rn closesocket(s);rn rnrn if(setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char *)&optval,sizeof(optval))==SOCKET_ERROR)rn rn closesocket(s);rn rnrn SOCKADDR_IN to;rn to.sin_family=AF_INET;rn to.sin_addr.s_addr= INADDR_BROADCAST;rn to.sin_port=67;//这是应该是0043,变成了4300rnrn Byte lpbuffer[62]=rn rn 0X01,0X01,0X06,0x00,0x00,0X00,0X00,0X00,0X00,0X00,rn 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,rn 0X00,0X00,0X00,0X00,0X00,0X19,0X66,0X1A,0X25,0X54,rn 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,rn 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,rn 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,rn 0X00,0X00rn ;rnrn int length;rn if((length==sendto(s,lpbuffer,62,0,(LPSOCKADDR)&to,sizeof(SOCKADDR)))==SOCKET_ERROR)////发送,对于lpbuffer的内容是自己写的,可能不正确,对dhcp 请求的报文不是很理解rn rn closesocket(s);rn rnrn SOCKADDR_IN from;rn int len,fromlen;rn fromlen=sizeof(SOCKADDR_IN);rn Byte recbuffer[2400];rn if((len=recvfrom(s,recbuffer,2400,0,(LPSOCKADDR)&from,&fromlen))==SOCKET_ERROR)////收不到rn rn //失败rn rn elsern rnrn rnrn对lpbuffer应该发送的内容不是很理解,请帮我写一下,也不知道是没发出去,还是什么别的问题
java socket 实现客户端互聊,广播(简易版)
1:用户存储以及发送
socket实现客户端与客户端通信
最近闲来无聊,看了一下socket通信,实现了一个最简版的客户端与客户端通信。 如果想通过客户端与客户端通信,有两种解决方案,一、使用服务器端进行转发,二、使用p2p技术 这里是使用服务器端进行转发写的例子,代码比较简陋, 主要思想是: 1、服务器端开启对socke的读写线程,用来监听客户端的通信 2、服务器端保存客户端登录的信息,使用一个map来装,保存维护该客户端的线程名、线程。 ...
请问C++的服务器端和C#(PDA)的客户端怎么用socket连?
哪位大侠能给个范例么
请问用PHP怎么实现请求转发啊?
有2个web服务器A,B。rnA不能直接访问,用户可以访问B,然后B向A发出请求,把A响应的结果发送给用户。B服务器类似于代理服务器rn这个功能用PHP怎么实现?
请问用DataOutputStream怎么实现换行啊?
小弟我要用DataOutputStream中的方法输出一个换行符到文件中.不知道该怎样实现,忘各位高手指教.谢谢!
请问用C怎么实现面向对象啊~~
请问用C怎么实现面向对象啊~~rnrn希望各位朋友能写出个代码的示例rnrn听说是用函数指针,但是不知道怎么用rnrn先谢谢各位朋友,我是菜鸟
用广播(BroadcastReceiver)监听电池的变化
如果我们想要监听电池电量的变化,只是使用监听事件的话,当我们程序没有运行,就监听不到电池电量的改变,这时候就需要使用广播了,这里就介绍一下广播监听电池的使用,以及一些电池的属性 package com.example.butterydemo; import android.os.BatteryManager; import android.os.Bundle; import android.u
android 用广播接受者监听手机网络状态
像QQ啥 一断网就View.VISIBLE 出现类似这种提示这种是怎么做的呢?就是监听网络状态然后做出相应的处理,可以通过service或者广播接收者实现,这里讲解下如何用广播接收者BroadcastReceiver实现:因为android系统网络状态变化会发出ConnectivityManager.CONNECTIVITY_ACTION的广播,所以监听这个就行了。上代码:先上个判断网络工具类:p...
请问各位大侠,怎么实现广播
最好给个例子看看
监听网络变化的广播
public class NetBroadcast extends BroadcastReceiver { private SharedPreferences sp; @Override public void onReceive(Context context, Intent intent) { ConnectivityManager manager =
广播监听网络状态
在oncreat中进行注册广播IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); networkChangeReceiver = new NetWord(); //这个是自己写的广播接收者 registerReceive...
Android动态注册监听广播
刚刚写了个测试动态注册监听的小demo 在xml里面配置上网络权限一切OK
Android 监听系统启动广播
public class BootCompletedReceiver extends BroadcastReceiver { private static final String TAG = BootCompletedReceiver.class.getSimpleName(); @Override public void onReceive(Context context, Inten...
Home键的广播监听
Home键的广播监听对于Home键的监听不是那么容易,因为Home键可以将程序退出放在后台,所以这个事件是直接分发给系统,系统接收到之后做相应处理,Home键的事件不是直接传递到应用里面.所以在上述监听Back键的代码中,相应的回调中是收不到Home键的事件的.参考文后的博客链接,对Home键的监听主要通过注册广播接收器实现,拦截让窗口关闭的系统动作,然后根据Intent里面的具体参数,分析当前到底
广播监听网络
//清单文件配置 //MainActivity动态注册 private ReceiverJt receiverJt; //动态注册 receiverJt=new ReceiverJt(); registerReceiver(receiverJt,new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION; //判断网络
android监听网络状态的广播
android监听网络状态的广播
相关热词 c# stream 复制 android c# c#监测窗口句柄 c# md5 引用 c# 判断tabtip 自己写个浏览器程序c# c# 字符串变成整数数组 c#语言编程写出一个方法 c# 转盘抽奖 c#选中treeview