java socket一对多通信如何实现?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java socket一对多通信如何实现?相关的知识,希望对你有一定的参考价值。

现在有一个服务器端,多个客户端,每当一个客户端接入服务器端的时候,服务器端就建立一个线程。
现在问题,当服务器端发送消息的时候,只有一个客户端接受到了信息,其他连接到的客户端没有反映。

参考技术A 【server端】

import java.io.*;
import java.net.*;
public class MultiSocketServer

public static void main(String str[]) throws IOException

ServerSocket server=new ServerSocket(3333);//绑定端口
while(true)

Socket client=server.accept();//监听
ChildTh child=new ChildTh(client);
Thread t=new Thread(child);
t.start();



class ChildTh implements Runnable

private Socket client;
public ChildTh(Socket client)

this.client=client;


public void run()
try

BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out=new PrintWriter(client.getOutputStream());
while(true)

String s=in.readLine();
System.out.println(s);
out.println("has received……");
out.flush();
if(s.equals("end"))
break;

client.close();

catch(Exception e)

e.printStackTrace();



【client端】
import java.net.*;
import java.io.*;
public class MultiSocketClient

static Socket server;
public static void main(String str[]) throws IOException

server=new Socket("222.195.151.47",3333);
BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream()));
PrintWriter out=new PrintWriter(server.getOutputStream());
BufferedReader wt=new BufferedReader(new InputStreamReader(System.in));
while(true)

String s=wt.readLine();
out.println(s);
out.flush();
if(s.equals("end"))

break;

System.out.println(in.readLine());

server.close();

参考技术B 服务器端发送消息,你要知道给哪个客户端发,应该是将所有的客户端连接都放在数组里,然后遍历数组发送
参考下吧: http://wenku.baidu.com/view/a9598469c5da50e2524d7f82.html本回答被提问者采纳
参考技术C 看看是不是线程被锁住了,比如socket.read(),最好是一个连接用独立的线程,这样不会相互影响追问

我发现原因是每次服务器写的线程都是在和另一个客户端单独建立的线程中进行的,所以处于其他线程的客户端就没办法收到消息了。要所有客户端都能收到服务端的同样的消息,怎么办?现在每个连接是单独的一个线程,导致消息通道都是独立的了

delphi中如何实现多线程socket通信时

参考技术A 我再说具体些,在delphi中实现收集socket通信时,应用TserverSocket类做办事器端,个中该类的ServerType属性有两个选择,分别决定办事器端是为每个客户request生成一个线程(选stThreadBlocking)照样所有的客户request都在一个线程中处理(选stNonBlocking),当我选择stThreadBlocking用线程方法时,客户端发送信息时,办事器端不克不及激活OnClientRead事宜,而被选择非线程方法时则可以实现。

以上是关于java socket一对多通信如何实现?的主要内容,如果未能解决你的问题,请参考以下文章

java是如何实现聊天功能的?

将socket通信实现多进程

项目日志之基于Java socket的网络通讯

Java实现Socket通信

delphi中如何实现多线程socket通信时

java的客户端用的是Socket,服务器端用SocketChannel,这两种能实现通信么? 说得比较白,望理解