首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java并发套接字编程

Java并发套接字编程
EN

Stack Overflow用户
提问于 2018-04-28 12:36:34
回答 3查看 2.2K关注 0票数 1

下面是简单并发服务器的代码。每当我运行多个客户端时,服务器只输出第一个客户端的输入。我不知道我做错了什么。任何帮助都将不胜感激。

代码语言:javascript
复制
public static void main(String[] args) {
    try {
        ServerSocket serverSocket = new ServerSocket(8001);
        while (true){
            Socket clientSocket = serverSocket.accept();
            System.out.println(clientSocket);
            ConcurrentServer client = new ConcurrentServer(clientSocket);
            client.start();
        }
    } catch (IOException i){}
}

public void run(){
    try {
        inputStream = new BufferedReader(new InputStreamReader(concurrentSocket.getInputStream()));
        outputStream = new PrintWriter(new OutputStreamWriter(concurrentSocket.getOutputStream()));

        String testString = inputStream.readLine();
        System.out.println(testString);


    } catch (IOException i){}
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-28 18:14:45

这段代码可以帮助您理解如何并发运行多个客户端。:)

这段代码是做什么的? TCP客户端向服务器发送一个字符串,而TCP服务器以大写格式发回字符串&服务器可以通过多个连接并发地完成这一任务。

我已经在中为服务器提供了3个文件,还有一个用于用多个客户端(ClientTest.java)测试服务器。

Main.java

代码语言:javascript
复制
import java.io.IOException;

public class Main {

    public static void main(String[] args) {
        try {
            new Server(3000).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Server.java

代码语言:javascript
复制
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Logger;

public class Server {

    private ServerSocket sSocket;
    private boolean run;
    private int port;

    public Server(int port) throws IOException {
        this.port = port;
        this.sSocket = new ServerSocket(this.port);
    }

    public void start() {

        this.run = true;
        Logger.getLogger(getClass().getName()).info("Server is listening on port: " + port);

        try {
            while (run) {
                Socket cs = sSocket.accept();
                Logger.getLogger(getClass().getName())
                        .info("New Client Connected! " + cs.getPort());
                new Thread(new Client(cs)).start(); // Put to a new thread.
            }
        } catch (IOException e) {
            Logger.getLogger(getClass().getName()).severe(e.getMessage());
        }
    }

    public void stop() {
        this.run = false;
    }
}

Client.java (服务器上的客户机进程)

代码语言:javascript
复制
import java.io.*;
import java.net.Socket;
import java.util.logging.Logger;

public class Client implements Runnable {

    private Socket clientSocket;

    private DataOutputStream out; // write for the client
    private BufferedReader in; // read from the client

    public Client(Socket clientSocket) {
        this.clientSocket = clientSocket;
    }

    @Override
    public void run() {
        // Do client process
        outToClient(inFromClient().toUpperCase());
        closeConnection();
    }

    private String inFromClient() {

        String messageFromClient = "";

        /*
         *  Do not use try with resources because once -
         *  - it exits the block it will close your client socket too.
         */
        try {
            in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            messageFromClient = in.readLine();
        } catch (IOException e) {
            Logger.getLogger(getClass().getName()).severe("InFromClientErr - " + e.getMessage());
        }

        return messageFromClient.trim().equals("") ? "No Inputs given!" : messageFromClient;
    }

    private void outToClient(String message) {
        try {
            out = new DataOutputStream(clientSocket.getOutputStream());
            out.writeBytes(message);
        } catch (IOException e) {
            Logger.getLogger(getClass().getName()).severe("OutToClientErr - " + e.getMessage());
        }
    }

    private void closeConnection() {
        try {
            in.close();
            out.close();
            clientSocket.close();
        } catch (NullPointerException | IOException e) {
            Logger.getLogger(getClass().getName()).severe(e.getMessage());
        }
    }
}

ClientTest.java (用于测试客户端)

代码语言:javascript
复制
import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class ClientTest {

    public static void main(String[] args) {

        Socket clientSocket;

        try {
            clientSocket = new Socket("localhost", 3000);

            DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
            BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

            outToServer.writeBytes(new Scanner(System.in).nextLine() + '\n'); // Get user input and send.
            System.out.println(inFromServer.readLine()); // Print the server response.

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2018-04-28 13:05:10

相反,问题在于客户。不是服务器。套接字是在for循环之外声明的,因此只创建了一个连接。如下所示:

代码语言:javascript
复制
public static void main(String[] args) {
    try {
        socket = new Socket("127.0.0.1", 8001);

        for (int i = 0; i < 5; i++){
            System.out.println("Starting client: " + i);
            ConcurrentClient concurrentClient = new ConcurrentClient(socket, i);
            concurrentClient.run();
        }
    } catch (IOException io) {
    }
}

套接字应该在for循环中声明如下:

代码语言:javascript
复制
public static void main(String[] args) {
    try {
        for (int i = 0; i < 5; i++){
            socket = new Socket("127.0.0.1", 8001);
            System.out.println("Starting client: " + i);
            ConcurrentClient concurrentClient = new ConcurrentClient(socket, i);
            concurrentClient.run();
        }
    } catch (IOException io) {
    }
}
票数 -1
EN

Stack Overflow用户

发布于 2018-04-28 13:09:56

我真的不知道为什么你需要这么复杂的输入和输出流结构。最好是使用扫描仪,以等待新的输入。此外,您还可以使用PrintWriter输出会话结果。

以下是接受多个客户端的服务器:

代码语言:javascript
复制
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class ConcurrentServer extends Thread {
private Socket concurrentSocket;

public ConcurrentServer(Socket clientSocket) {
    this.concurrentSocket = clientSocket;
}

public static void main(String[] args) {
    try {
        ServerSocket serverSocket = new ServerSocket(8001);
        while (true){
            Socket clientSocket = serverSocket.accept();
            System.out.println(clientSocket);
            ConcurrentServer client = new ConcurrentServer(clientSocket);
            client.start();
        }
    } catch (IOException i){}
}

public void run(){
    try {
        InputStream inputStream = concurrentSocket.getInputStream();
        Scanner scanner = new Scanner(inputStream);
        OutputStream outputStream = concurrentSocket.getOutputStream();
        PrintWriter pw = new PrintWriter(outputStream);

        while(scanner.hasNextLine()){
            String line = scanner.nextLine();
            System.out.println(line);
            pw.println("message: " + line);
            pw.flush();
        }
    } catch (IOException i){}
}

}

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50076607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档