这几天被Scala吸引住了,去图书馆借了本《快学Scala》,发现很funny~,然后无意在youtube上看到一个关于scala的socket编程。于是跟着学习,整理了一下代码,如下:
服务器代码:
package com.server
import java.net.{ServerSocket,Socket}
import java.io.BufferedInputStream
import java.io.BufferedOutputStream
import java.io.PrintStream
import java.io.InputStream
import collection.mutable
import java.io.InputStreamReader
import java.io.BufferedReader
/**
* 基于Socket的简单聊天服务器,实现代理功能,加入客户端自定义名字。利用Scala中的Actor实现并发。
* @author 邓慧
*/
object SimpleNet {
case class User(sock:Socket,is:BufferedReader,ps:PrintStream,name:String)
def main(args : Array[String]) : Unit = {
val users = new mutable.ArrayBuffer[User] with mutable.SynchronizedBuffer[User]
val ss = new ServerSocket(4444)
actors.Actor.actor{
while(true){
val sock = ss.accept()
val is = new BufferedReader(new InputStreamReader(sock.getInputStream()))
val os = new PrintStream(sock.getOutputStream())
actors.Actor.actor{
os.println("what's your name?")
users += User(sock,is,os,is.readLine())
}
}
}
while(true){
for(user <- users){
if(user.is.ready()){
val input = user.is.readLine()
for(user2 <- users){
user2.ps.println(user.name+":"+input)
}
}
}
}
}
}
本人觉得这好简洁,java的确太冗余了。
客户端代码:
package com.client
import java.net.Socket
import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.PrintStream
/**
* simple聊天客户端,发送和接受字符串
*/
object ChatClient {
def main(args : Array[String]): Unit={
val host = "localhost"
val port = 4444
val sock = new Socket(host,port)
val is = new BufferedReader(new InputStreamReader(sock.getInputStream()))
val os = new PrintStream(sock.getOutputStream())
actors.Actor.actor{
while(true){
if(is.ready()){
val output = is.readLine()
println(output)
}
}
}
while(true){
val input = readLine
os.println(input)
}
}
}