首页 文章

使用线程池的客户端/服务器连接?

提问于
浏览
0

我正在编写一个使用线程池的客户端/服务器应用程序,以便多个客户端可以同时与服务器通信并向其发送命令:

但它不起作用,即使是一个非常简单的客户端:

这是我的客户:

if(args.length==0) {
        host="127.0.0.1";
        port=11111;
    } else {
        host=args[0];
        String portString = args[1];
        try {
            port = Integer.parseInt(portString);
        } catch(Exception e) {
            e.printStackTrace();
            port = 11111;
        }
    }

    try {
        System.out.println("Client connects to host=" + host + " port=" + port);
        Socket skt = new Socket(host, port);//line 30 in the exception
        BufferedReader myInput = new BufferedReader(new InputStreamReader(skt.getInputStream()));
        PrintWriter myOutput = new PrintWriter(skt.getOutputStream(), true);

        myOutput.println("Hello I am the Client!");
        String buf=myInput.readLine();
        System.out.println(buf + "=buf");


        if(buf!=null) {
            System.out.println("Client receives " + buf + " from the Server!");
            buf=myInput.readLine();
            System.out.println(buf);

        }
        myOutput.close();
        myInput.close();
        skt.close();

但我得到:

客户端连接到host = 127.0.0.1 port = 11111 java.net.ConnectException:连接被拒绝:在java.net上的java.net.DualStackPlainSocketImpl.socketConnect(未知来源)java.net.DualStackPlainSocketImpl.connect0(本地方法)连接java.net.SocksSocketImpl上java.net.PlainSocketImpl.connect(未知来源)java.net.AbstractPlainSocketImpl.connect(未知来源)的java.net.AbstractPlainSocketImpl.connectToAddress(未知来源)中的.AbstractPlainSocketImpl.doConnect(未知来源)来自java.net.Socket.connect(未知源)的java.net.Socket.connect(未知源)的.connect(未知源)java.net.Socket . (未知源),java.net.Socket . (未知)来自)client.Client.main(Client.java:30)//查看代码中的注释

所以我认为我的服务器可能是错误的,因为我无法在客户端看到它:

ServerMain.java

public static void main(String[] args) {

    try {
        clientlistener = new ClientListener(server);
        //serversocket = new ServerSocket();
    } catch (IOException e) {
        System.out.println("Could not listen on tcpPort: " + tcpPort);
        e.printStackTrace();
        System.exit(-1);
    } 
}

在这里,我用一个新的打开clientlistener

private static Server server = new Server();

并希望将它添加到serverSocket而不是threadPool:

public ClientListener(Server server) throws ServerException{
    this.server=server;

     try {
            serverSocket = new ServerSocket(server.getTcpPort());
        } catch (IOException e) {
            throw new ServerException(e.getMessage());
        }

    System.out.println(String.format("Accepting new clients " +
            "on %s", serverSocket.getLocalSocketAddress()));
}

/**
 * Spawns new threads on incoming connection requests from clients.
 * */
@Override
public void run() {
    while(true){
        try {
            ClientCommunicator cc = new ClientCommunicator(serverSocket.accept(), pool);
            threadPool.execute(cc);
            clientComms.add(cc);
        } catch (SocketException e) {
            System.out.println(e.getMessage());
            return;
        } catch (IOException e) {
            System.out.println(e.getMessage());
            return;
        }
    }
}

ClientCommunicator只是一个从命令行读取的类 .

我的问题是:

什么是我的插座连接wron?

我打开一个并从客户那里接受它?

我非常喜欢你的答案!

1 回答

  • 2

    我认为您的服务器已关闭,这就是您拒绝连接的原因 . 我没有看到你的server.accept()调用使服务器套接字等待新客户端到来并返回一个Socket对象而不是SocketServer .

    我已经为你完成了这段代码 . 我希望它有所帮助 .

    package com.sockets.exam1;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ServerCode {
        public static void main(String[] args) {
            try {
                ServerSocket server = new ServerSocket(11111);
                while (true) {                                              
                    new ThreadSocket(server.accept());
                }
            } catch (Exception e) {
            }
        }
    }
    class ThreadSocket extends Thread{
        private Socket insocket;    
        ThreadSocket(Socket insocket){
            this.insocket = insocket;
            this.start();
        }       
        @Override
        public void run() {     
            try {
                System.out.println("procesing request");
                BufferedReader in = new BufferedReader(new InputStreamReader(
                        insocket.getInputStream()));
                PrintWriter out = new PrintWriter(insocket.getOutputStream(),
                        true);
                String instring = in.readLine();
                out.println("The server got this: " + instring.toUpperCase());
                insocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }       
        }
    }
    

相关问题