向服务器发送消息,向所有客户端发送消息(客户端-服务器通信)

小编典典

对于成熟的服务器,不建议使用以下答案,因此您应该将Java EE与servlet,Web服务等配合使用。

仅在少数几台计算机希望连接以执行特定任务的情况下才使用此方法,并且使用简单的Java套接字不是普遍问题。想想分布式计算或多人游戏。

编辑:

自从第一篇博文以来,我已经大大更新了此架构,现在已经过测试并且是线程安全的。任何需要它的人都可以在这里下载它。

只需使用(直接或通过子类化)Server和Client,start()它们便已准备就绪。阅读内联注释以获得更强大的选项。

尽管客户端之间的通信非常复杂,但我将尽可能简化它。

这是服务器中的要点:

保留已连接客户端的列表。

定义一个线程,用于服务器输入。

定义接收消息的队列。

从队列中轮询线程,并对其进行处理。

用于发送消息的一些实用方法。

对于客户:

定义一个线程,供客户输入。

定义接收消息的队列。

从队列中轮询线程,并对其进行处理。

这是Server类:

public class Server {

private ArrayList clientList;

private LinkedBlockingQueue messages;

private ServerSocket serverSocket;

public Server(int port) {

clientList = new ArrayList();

messages = new LinkedBlockingQueue();

serverSocket = new ServerSocket(port);

Thread accept = new Thread() {

public void run(){

while(true){

try{

Socket s = serverSocket.accept();

clientList.add(new ConnectionToClient(s));

}

catch(IOException e){ e.printStackTrace(); }

}

}

};

accept.setDaemon(true);

accept.start();

Thread messageHandling = new Thread() {

public void run(){

while(true){

try{

Object message = messages.take();

// Do some handling here...

System.out.println("Message Received: " + message);

}

catch(InterruptedException e){ }

}

}

};

messageHandling.setDaemon(true);

messageHandling.start();

}

private class ConnectionToClient {

ObjectInputStream in;

ObjectOutputStream out;

Socket socket;

ConnectionToClient(Socket socket) throws IOException {

this.socket = socket;

in = new ObjectInputStream(socket.getInputStream());

out = new ObjectOutputStream(socket.getOutputStream());

Thread read = new Thread(){

public void run(){

while(true){

try{

Object obj = in.readObject();

messages.put(obj);

}

catch(IOException e){ e.printStackTrace(); }

}

}

};

read.setDaemon(true); // terminate when main ends

read.start();

}

public void write(Object obj) {

try{

out.writeObject(obj);

}

catch(IOException e){ e.printStackTrace(); }

}

}

public void sendToOne(int index, Object message)throws IndexOutOfBoundsException {

clientList.get(index).write(message);

}

public void sendToAll(Object message){

for(ConnectionToClient client : clientList)

client.write(message);

}

}

这里是Client类:

public class Client {

private ConnectionToServer server;

private LinkedBlockingQueue messages;

private Socket socket;

public Client(String IPAddress, int port) throws IOException{

socket = new Socket(IPAddress, port);

messages = new LinkedBlokingQueue();

server = new ConnecionToServer(socket);

Thread messageHandling = new Thread() {

public void run(){

while(true){

try{

Object message = messages.take();

// Do some handling here...

System.out.println("Message Received: " + message);

}

catch(InterruptedException e){ }

}

}

};

messageHandling.setDaemon(true);

messageHandling.start();

}

private class ConnectionToServer {

ObjectInputStream in;

ObjectOutputStream out;

Socket socket;

ConnectionToServer(Socket socket) throws IOException {

this.socket = socket;

in = new ObjectInputStream(socket.getInputStream());

out = new ObjectOutputStream(socket.getOutputStream());

Thread read = new Thread(){

public void run(){

while(true){

try{

Object obj = in.readObject();

messages.put(obj);

}

catch(IOException e){ e.printStackTrace(); }

}

}

};

read.setDaemon(true);

read.start();

}

private void write(Object obj) {

try{

out.writeObject(obj);

}

catch(IOException e){ e.printStackTrace(); }

}

}

public void send(Object obj) {

server.write(obj);

}

}

2020-09-11

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值