スレッドプールを使用するクライアント/サーバーアプリケーションを作成しているので、複数のクライアントが同時にサーバーと通信し、サーバーにコマンドを送信できます。
ただし、非常に単純なクライアントでも機能しません。
これが私のクライアントです:
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は、コマンドラインから読み取るための単なるクラスです。
私の質問は:
ソケット接続で何が問題になりますか?
私はそれを開いてクライアントからそれを受け入れていますか?
私は本当にあなたの答えに感謝します!!!