簡體   English   中英

如何在java中向特定客戶端發送響應?

[英]How to send response to a specific client in java?

我有一個具有多個客戶端連接的java服務器。 如果一個客戶端向服務器發送消息v,則服務器將消息廣播給所有客戶端。 我應該在代碼中更改什么,以便它只回答發送郵件的客戶端?

特此代碼:

EchoServer.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class EchoServer
{
public static void main(String[] args) throws IOException
{
    EchoServer server = new EchoServer();
    server.start();
}

private ArrayList<PrintWriter> writers = new ArrayList<>();

public void start() {
    ServerSocket serverSocket = null;

    try
    {
        serverSocket = new ServerSocket(5000);

        while (true) {
            Socket clientSocket = serverSocket.accept();

            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            writers.add(out);
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

            Thread t = new ClientHandler(in, this);
            t.start();
        }
    }
    catch (IOException e)
    {
        System.out.println("Exception caught when trying to listen on port 5000 or listening for a connection");
        System.out.println(e.getMessage());
    }
    finally
    {
        try {
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public synchronized void broadcast(String inputLine) {
    for (PrintWriter writer : writers) {
        writer.println(inputLine);
    }
}
}

EchoClient.java

import java.io.*;
import java.net.*;

public class EchoClient
{
public static void main(String[] args) throws IOException
{
    String hostName = "localhost";
    int portNumber = 5000;
    Socket echoSocket = null;

    try
    {
        echoSocket = new Socket(hostName, portNumber);
        PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true);

        BufferedReader in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));

        Thread t = new ServerHandler(in);
        t.start();

        String userInput;
        while ((userInput = stdIn.readLine()) != null)
        {
            out.println(userInput);
        }
    }
    catch (UnknownHostException e)
    {
        System.err.println("Don't know about host " + hostName);
        System.exit(1);
    }
    catch (IOException e)
    {
        System.err.println("Couldn't get I/O for the connection to " + hostName);
        System.exit(1);
    }
    finally
    {
        echoSocket.close();
    }
}
}

ServerHandler

import java.io.BufferedReader;
import java.io.IOException;

public class ServerHandler extends Thread {
private BufferedReader reader;

public ServerHandler(BufferedReader reader) {
    super();
    this.reader = reader;
}

@Override
public void run() {
    String readLine;
    try {
        while((readLine = reader.readLine()) != null) {
            System.out.println(readLine);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

ClientHandler中

import java.io.BufferedReader;
import java.io.IOException;

public class ClientHandler extends Thread {
private BufferedReader reader;

private EchoServer server;

public ClientHandler(BufferedReader reader, EchoServer server) 
{
    this.reader = reader;
    this.server = server;
}

@Override
public void run() {
    while (true) {
        String inputLine;
        try {
            while ((inputLine = reader.readLine()) != null)
            {
                server.broadcast(inputLine);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
}

目前,當您從客戶端收到消息時,ClientHandler會調用服務器的廣播方法。 這是我如何回應一個客戶端。

1)將clientSocket傳遞給ClientHandler。 所以下面的代碼將替換EchoServer中的代碼。

    Thread t = new ClientHandler(in, clientSocket, this);
    t.start();

然后你的客戶端處理程序將有一個套接字,它也可以回寫。

import java.io.BufferedReader;
import java.io.IOException;
import java.net.Socket;

public class ClientHandler extends Thread {
private BufferedReader reader;
private Socket clientSocket;
private EchoServer server;

public ClientHandler(BufferedReader reader, Socket clientSocket EchoServer server) 
{
    this.reader = reader;
    this.server = server;
    this.clientSocket = clientSocket;
}

@Override
public void run() {
    while (true) {
        String inputLine;
        try {
            while ((inputLine = reader.readLine()) != null)
            {
                PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
                out.println(inputLine);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM