Java并发套接字编程

拼图

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

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){}
}
年龄

此代码可能会帮助您了解如何同时运行多个客户端。:)

这段代码有什么作用? TCP 客户端向服务器发送一个字符串,TCP 服务器以大写格式发回字符串,服务器可以通过多个连接同时执行此操作。

为服务器包含了 3 个文件,还有一个用于使用多个客户端测试服务器(ClientTest.java)

主程序

import java.io.IOException;

public class Main {

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

服务器端.java

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(服务器上的客户端进程)

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(用于测试客户端)

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();
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

处理Java套接字并发

来自分类Dev

Node.js-Azure-Socket.io-为什么我用完了并发套接字?

来自分类Dev

JUnit负载测试与服务器的数千个并发套接字连接

来自分类Dev

Java套接字编程聊天

来自分类Dev

Java套接字编程对话

来自分类Dev

JUnit对与服务器的数千个并发套接字连接进行负载测试

来自分类Dev

提取文件内容并附加到套接字并发送套接字编程

来自分类Dev

cmd中的Java套接字编程

来自分类Dev

Java套接字编程和流

来自分类Dev

使用 UDP 进行 Java 套接字编程

来自分类Dev

从Node.js代码引发套接字事件

来自分类Dev

Android套接字编程

来自分类Dev

套接字编程

来自分类Dev

AVR的套接字编程

来自分类Dev

Python套接字编程

来自分类Dev

套接字编程

来自分类Dev

套接字编程ConnectException

来自分类Dev

Python套接字压力并发

来自分类Dev

Java套接字编程-套接字在连接完成之前超时

来自分类Dev

使用Java套接字发送ByteArray(Android编程)

来自分类Dev

如何在Java套接字编程中接收对象?

来自分类Dev

如何通过Java中的套接字编程传输zip文件?

来自分类Dev

Java套接字编程中的连接拒绝错误

来自分类Dev

静态IP对Java套接字编程重要吗?

来自分类Dev

如何通过Java中的套接字编程传输zip文件?

来自分类Dev

如何使用Java套接字编程获取本地端口

来自分类Dev

Java套接字编程中的连接拒绝错误

来自分类Dev

具有ReadLine异常的Java处理中的套接字编程

来自分类Dev

解决套接字编程问题