请问用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问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问