【问题标题】:scala and java io and sockets issuescala和java io和sockets问题
【发布时间】:2012-05-13 12:52:13
【问题描述】:

我在学习java net programing的一个例子,决定分别用java-scala写一个client-server,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”以获取先前发送的字符串,这就是问题所在,我只需要一次这样的服务器响应:Echo (1): some string,我没有想法,我通过打印到控制台来跟踪它,但无法弄清楚发生了什么。

编辑:

预期客户的输出:

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

在预期的输出中,您不必重新键入 enter 即可从服务器获取响应。

服务器的输出已经按预期工作。

【问题讨论】:

  • 您的问题最不清楚。我建议您以与实际输出相同的形式添加预期输出。

标签: java sockets scala io


【解决方案1】:

在我看来,你向 Actor 发送了一个“”,所以他只返回“Echo (1):”+“”。如果我计算输入,我看到的“s”与“Echo (1): s”一样多。

【讨论】:

  • 其实恰恰相反,当你发送一个字符串时你会收到空的 Echo (1),如果你发送 "" 你会得到你刚刚发送的最后一个字符串。
【解决方案2】:

您感到困惑,因为您在客户端第一次连接时发送“Hello!press BYE to exit”,但客户端实际上并没有专门阅读这一行。因此,当您期望读取您发送的回显消息时,您正在客户端中读取它,因此您的客户端总是在您认为它达到的位置后面读取一个回显。

解决方案:要么从服务器中删除“Hello!press BYE to exit”,要么在第一次连接客户端时读取它,然后再进入循环。

【讨论】:

  • 现在我明白为什么它不起作用了,这需要 19 个小时来奖励你的答案。
猜你喜欢
  • 2015-05-10
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 2019-04-26
  • 2015-11-12
  • 1970-01-01
  • 2021-03-22
  • 2012-11-01
相关资源
最近更新 更多