返回顶部

收藏

Scala 之 Socket 通讯示例

更多

scala代码

package examples

import java.io._
import java.net.{InetAddress,ServerSocket,Socket,SocketException}
import java.util.Random

/** 
 * Simple client/server application using Java sockets. 
 * 
 * The server simply generates random integer values and 
 * the clients provide a filter function to the server 
 * to get only values they interested in (eg. even or 
 * odd values, and so on). 
 */
object randomclient {

  def main(args: Array[String]) {
    val filter: Int => Boolean = try {
      Integer.parseInt(args(0)) match {
        case 1 => x: Int => x % 2 != 0
        case 2 => x: Int => x % 2 == 0
        case _ => x: Int => x != 0
      }
    }
    catch {
      case _ => x: Int => x < 100
    }

    try {
      val ia = InetAddress.getByName("localhost")
      val socket = new Socket(ia, 9999)
      val out = new ObjectOutputStream(
        new DataOutputStream(socket.getOutputStream()))
      val in = new DataInputStream(socket.getInputStream())

      out.writeObject(filter)
      out.flush()

      while (true) {
        val x = in.readInt()
        println("x = " + x)
      }
      out.close()
      in.close()
      socket.close()
    }
    catch {
      case e: IOException =>
        e.printStackTrace()
    }
  }

}

object randomserver {

  def main(args: Array[String]): Unit = {
    try {
      val listener = new ServerSocket(9999);
      while (true)
        new ServerThread(listener.accept()).start();
      listener.close()
    }
    catch {
      case e: IOException =>
        System.err.println("Could not listen on port: 9999.");
        System.exit(-1)
    }
  }

}

case class ServerThread(socket: Socket) extends Thread("ServerThread") {

  override def run(): Unit = {
    val rand = new Random(System.currentTimeMillis());
    try {
      val out = new DataOutputStream(socket.getOutputStream());
      val in = new ObjectInputStream(
        new DataInputStream(socket.getInputStream()));

      val filter = in.readObject().asInstanceOf[Int => Boolean];

      while (true) {
        var succeeded = false;
        do {
          val x = rand.nextInt(1000);
          succeeded = filter(x);
          if (succeeded) out.writeInt(x)
        } while (! succeeded);
        Thread.sleep(100)
      }

      out.close();
      in.close();
      socket.close()
    }
    catch {
      case e: SocketException =>
        () // avoid stack trace when stopping a client with Ctrl-C
      case e: IOException =>
        e.printStackTrace();
    }
  }

}

标签:Socket,Scala

收藏

0人收藏

支持

0

反对

0

相关聚客文章
  1. 全 恒壮 发表 2011-05-29 11:39:12 判断Keep-Alive模式的HTTP请求的结束
  2. Freewind 发表 2013-02-05 11:17:49 00. Scala入群题目
  3. Freewind 发表 2013-05-09 02:19:58 Lift项目零散笔记
  4. 方 腾飞 发表 2013-08-09 13:05:38 讨喜的隔离可变性(九)混合使用角色和STM
  5. hongjiang 发表 2014-03-15 12:01:56 话说模式匹配(5) for表达式中的模式匹配
  6. 博主 发表 2013-09-22 16:00:00 scala主要特性一览
  7. 博主 发表 2014-01-02 14:13:00 剥掉Scala的糖衣(11) -- structural types
  8. Freewind 发表 2014-06-14 03:32:36 Scala热情workshop(1). 安装快速尝试scala代码的工具: scalaconsole
  9. 网猫 发表 2014-07-02 06:10:35 scala 快速入门教程(学习笔记二)
  10. Freewind 发表 2011-09-13 14:00:34 使用sbt时遇到的一些问题
  11. Freewind 发表 2011-09-22 03:46:00 参数curry化
  12. ajaxj 发表 2014-08-25 09:25:25 java scala 开发spark程序

发表评论