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

しかし、私は得る:

クライアントはホストに接続します=127.0.0.1ポート=11111java.net.ConnectException:接続が拒否されました:java.netのjava.net.DualStackPlainSocketImpl.socketConnect(不明なソース)のjava.net.DualStackPlainSocketImpl.connect0(ネイティブメソッド)で接続します。 AbstractPlainSocketImpl.doConnect(Unknown Source)at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)at java.net.AbstractPlainSocketImpl.connect(Unknown Source)at java.net.PlainSocketImpl.connect(Unknown Source)atjava.net.SocksSocketImpl。 connect(Unknown Source)at java.net.Socket.connect(Unknown Source)at java.net.Socket.connect(Unknown Source)at java.net.Socket。(Unknown Source)at java.net.Socket。(Unknown Source )at 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は、コマンドラインから読み取るための単なるクラスです。

私の質問は:

ソケット接続で何が問題になりますか?

私はそれを開いてクライアントからそれを受け入れていますか?

私は本当にあなたの答えに感謝します!!!

4

1 に答える 1

2

サーバーがダウンしていると思います。そのため、接続が拒否されました。サーバーソケットに新しいクライアントが来るのを待たせ、SocketServerではなくSocketオブジェクトを返すserver.accept()呼び出しが表示されません。

私はあなたのためにこのコードを作成しました。お役に立てば幸いです。

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();
        }       
    }
}
于 2012-10-13T19:33:05.370 に答える