2

チュートリアルのこのセクションから始めたところです。ポートとは何かなどの基本的な知識しかありません。

私はこのコードを実行しようとしました:

import java.io.*;
import java.net.*;

public class EchoClient {
    public static void main(String[] args) throws IOException {

        Socket echoSocket = null;
        PrintWriter out = null;
        BufferedReader in = null;

        try {
            echoSocket = new Socket("taranis", 7);
            out = new PrintWriter(echoSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(
                                        echoSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: taranis.");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for "
                               + "the connection to: taranis.");
            System.exit(1);
        }

        BufferedReader stdIn = new BufferedReader(
                               new InputStreamReader(System.in));
        String userInput;

    while ((userInput = stdIn.readLine()) != null) {
        out.println(userInput);
        System.out.println("echo: " + in.readLine());
    }

    out.close();
    in.close();
    stdIn.close();
    echoSocket.close();
    }
}

「ホストについて知らない:taranis。Javaの結果:1」

私が得るエラーキャッチです。私の限られた理解から; エコーサーバーは私のマシンに存在するものですか?その場合、これを実行するにはどうすればよいですか?それとも私は離れていますか?また、なぜ彼らはパラメータとして「taranis」を選んだのですか?

また、何が起こったかを確認するために、「taranis」を「localhost」に置き換えました。今回はIOExceptionをキャッチすることになりました。

編集:だから私はエコーサーバーがwin7でデフォルトで無効になっていることを発見し、それをアクティブにしました。ただし、telnetで接続することもできません。頭がおかしいだけかもしれないと思います。私もあなたが推薦したソケットを試しましたが成功しませんでした。

4

2 に答える 2

2

同じチュートリアルから:

... ここで使用される Socket コンストラクターには、接続先のマシンの名前とポート番号が必要です。サンプル プログラムでは、ホスト名 taranis を使用しています。これは、ローカル ネットワーク上の架空のマシンの名前です。マシンでこのプログラムを入力して実行するときは、ホスト名をネットワーク上のマシンの名前に変更してください。使用する名前が、接続先のマシンの完全修飾 IP 名であることを確認してください。2 番目の引数はポート番号です。ポート番号 7 は、Echo サーバーがリッスンするポートです。

いずれにせよ、taranis を に変更"localhost"して、マシンでエコー サービスが実行されていることを確認することをお勧めします。そうでない場合は、次のコードのようなものを使用して、エコー サーバーをシミュレートできます。

import java.net.Socket;
import java.util.Formatter;
import java.util.Scanner;
import java.io.IOException;
import java.net.ServerSocket;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class EchoServer {

    public static void main(String[] args) {
        try {
            new EchoServer(INSERTPORT).execute();
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    private ServerSocket serverSocket;
    private int port;

    private ArrayList<Client> clientList;
    private ExecutorService clientRunner;

    public EchoServer(int port) throws IOException {
        this.port = port;
        serverSocket = new ServerSocket(port);
        clientRunner = Executors.newCachedThreadPool();
        clientList = new ArrayList<>();
    }

    public void sendMessageToAll(String message) {
        for (Client c : clientList) {
            c.displayMessage(message);
        }
    }

    public void execute() throws IOException {
        while (true) {
            clientList.add(new Client(serverSocket.accept(), this));
            clientRunner.execute(clientList.get(clientList.size()-1));
        }
    }
    private class Client implements Runnable {

        private Socket clientSocket;
        private Scanner input;
        private Formatter output;

        public Client(Socket s) throws IOException {
            clientSocket = s;

            input = new Scanner(clientSocket.getInputStream());
            output = new Formatter(clientSocket.getOutputStream());
        }

        public void displayMessage(String s) {
            output.format(s + "\n");
            output.flush();
        }
        @Override
        public void run() {
            while(clientSocket.isConnected()) {
                if(input.hasNextLine()) {
                    sendMessageToAll(input.nextLine());
                }
            }
        }
    }
}

編集:完全を期すために、コードの実行に関するいくつかの問題について言及したように、サーバー(このコード)を実行し、バックグラウンドで実行したままにしてから、クライアント(投稿したコード)を実行します。私はそれをテストしました、うまくいきます。

于 2012-06-18T02:35:38.733 に答える
0

これを試して、

  1. taranis の代わりに127.0.0.1のループバック アドレスを使用します。

  2. 4444、8333 などの1024 より大きいポートを使用してください。

Client Server Commnu の学習に使用したコードも追加しています

クライアント側コード:

public class ClientWala {

    public static void main(String[] args) throws Exception{

        Boolean b = true;
    Socket s = new Socket("127.0.0.1", 4444);

    System.out.println("connected: "+s.isConnected());


    OutputStream output = s.getOutputStream();
    PrintWriter pw = new PrintWriter(output,true);

    // to write data to server
    while(b){

        if (!b){

             System.exit(0);
        }

        else {
            pw.write(new Scanner(System.in).nextLine());
        }
    }


    // to read data from server
    InputStream input   = s.getInputStream();
    InputStreamReader isr = new InputStreamReader(input);
    BufferedReader br = new BufferedReader(isr);
    String data = null;

    while ((data = br.readLine())!=null){

        // Print it using sysout, or do whatever you want with the incoming data from server

    }




    }
}

サーバー側コード:

public class ServerTest {

    ServerSocket s;

    public void go() {

        try {
            s = new ServerSocket(44457);

            while (true) {

                Socket incoming = s.accept();
                Thread t = new Thread(new MyCon(incoming));
                t.start();
            }
        } catch (IOException e) {

            e.printStackTrace();
        }

    }

    class MyCon implements Runnable {

        Socket incoming;

        public MyCon(Socket incoming) {

            this.incoming = incoming;
        }

        @Override
        public void run() {

            try {
                PrintWriter pw = new PrintWriter(incoming.getOutputStream(),
                        true);
                InputStreamReader isr = new InputStreamReader(
                        incoming.getInputStream());
                BufferedReader br = new BufferedReader(isr);
                String inp = null;

                boolean isDone = true;

                System.out.println("TYPE : BYE");
                System.out.println();
                while (isDone && ((inp = br.readLine()) != null)) {

                    System.out.println(inp);
                    if (inp.trim().equals("BYE")) {
                        System.out
                                .println("THANKS FOR CONNECTING...Bye for now");
                        isDone = false;
                        s.close();
                    }

                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                try {
                    s.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                e.printStackTrace();
            }

        }

    }

    public static void main(String[] args) {

        new ServerTest().go();

    }

}
于 2012-06-18T02:39:06.063 に答える