1

私はJavaネットプログラミングの例に従っており、それぞれjava-scalaでクライアントサーバーを書くことにしました.scalaコードは次のとおりです:

import scala.actors.Actor
import scala.actors.Actor._

import java.io._
import java.net._

class EchoActor(private val sock: Socket,
    private val id: Int) extends Actor{

    def act(){
        try{
            val in = new BufferedReader(
                new InputStreamReader(sock.getInputStream()))

            val out = new PrintWriter(
                sock.getOutputStream(), true)

            out.println("Hello! press BYE to exit")
            var done = false
            while(!done){
                var str = in.readLine()
                if (str == null) done = true
                else{
                    println(str) // debug
                    out.println("Echo (" + id + "): " + str)
                    if (str.trim().equals("BYE")) done = true
                }
            }
            sock.close()
        }
        catch{
            case e => e printStackTrace
        }
    }
}


object Main{
    def main(args: Array[String]){
        try{
            var i = 1
            val s = new ServerSocket(8189)

            while(true){
                var inc = s.accept()
                println("Spawning " + i)
                var a = new EchoActor(inc, i)
                a.start()
                i += 1
            }
        }
        catch{
            case e => e printStackTrace
        }
    }
}

そして、ここにJavaがあります:

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


public class Client{
    public static void main(String[] args){

        try{
            Socket s = new Socket("127.0.0.1",8189);

            BufferedReader in = new BufferedReader(
                new InputStreamReader(System.in));

            PrintWriter out = new PrintWriter(
                s.getOutputStream(), true);

            BufferedReader socketIn = new BufferedReader(
                new InputStreamReader(s.getInputStream()));

            System.out.println("Enter: to exit");
            String resp;
            String st
            while(true){
                st = in.readLine();
                if(st.equals("exit") || st.equals("quit")) break;
                else{
                    out.println(st);
                    resp = socketIn.readLine();
                    System.out.println(resp);
                }
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

サーバーからの出力:

Spawning 1
s

s

l
l
scala

java

Java の出力:

Enter: to exit
s
Hello! press BYE to exit

Echo (1): s
s
Echo (1):

Echo (1): s
l
Echo (1):
l
Echo (1): l
scala
Echo (1): l

Echo (1): scala
java
Echo (1):

Echo (1): java

Echo (1)送信したばかりの文字列に加えて印刷する予定の場所で空の応答を受信して​​いることがわかるように、以前Echo (1)に送信した文字列を取得するには「Enter」を再入力する必要があるため、サーバーからの応答が 1 つだけ必要です。このように一度だけ: Echo (1): some string、私はアイデアがありません。コンソールに出力して追跡しましたが、何が起こっているのかわかりません。

編集:

予想されるクライアントの出力:

...
s
Echo (1): s
java
Echo (1): java

enter予想される出力では、サーバーからの応答を取得するために再入力する必要はありません。

サーバーの出力はすでに期待どおりに機能しています。

4

2 に答える 2

2

クライアントが最初に接続したときに「Hello! press BYE to exit」を送信しているため、混乱していますが、クライアントは実際にはこの行を具体的に読み取っていません。したがって、送信したエコーメッセージを読むことを期待しているときにクライアントでそれを読んでいるので、クライアントは常に、あなたが考えている場所の後ろに1つのエコーを読んでいます。

解決策: サーバーから「Hello! press BYE to exit」を削除するか、最初にクライアントに接続したときにループに入る前にそれを読み取ります。

于 2012-05-07T04:43:54.530 に答える
0

私には、「」をアクターに送信したように見えるので、アクターは「エコー (1): " + ""」だけを返します。入力を数えると、「Echo (1): s」と同じくらい「s」が表示されます。

于 2012-05-04T09:39:38.707 に答える