38_网络编程_TCP

复制代码
import java.io._
import java.net.{InetAddress, ServerSocket, Socket}

// 获取 InetAddress 实例
object InetAddressTest extends App {
  // 通过 域名/IP地址 获取 ip对象
  private val address: InetAddress = InetAddress.getByName("www.baidu.com")
  println(s"通过域名获取ip对象 : ${address}")

  private val address1: InetAddress = InetAddress.getByName("110.242.68.4")
  println(s"通过ip获取ip对象 : ${address1}")

  // 获取本地 ip对象
  private val localHost: InetAddress = InetAddress.getLocalHost
  println(s"获取本地ip对象 : ${localHost}")

  // 获取 域名(hostname)
  private val hostName: String = address1.getHostName
  println(hostName)

  // 获取 IP地址
  private val ip: String = address.getHostAddress
  println(ip)

  // 测试是否可以达到 该主机
  private val bool: Boolean = localHost.isReachable(10)
  println(bool)


}

// 实现TCP 网络编程

// 案例一  客户端发送信息给服务端,服务端将接收到的信息打在控制台
object ServerSocketTest extends App {
  //1. 创建ServerSocket,指定端口号
  private val serverSocket = new ServerSocket(8899)

  //2. 获取Socket实例
  private val socket: Socket = serverSocket.accept

  //3. 获取输入流
  private val inputStream: InputStream = socket.getInputStream

  //4. 读取数据
  private val bytes = new Array[Byte](1024)
  private var i: Int = inputStream.read(bytes)
  while (i != -1) {
    println(s"客户端发送的数据 :${new String(bytes, 0, i)}")
    i = inputStream.read(bytes)
  }

  //5. 获取客户端信息
  println(s"客户端信息 IP:${socket.getInetAddress} hostname:${socket.getInetAddress.getHostName}")

  //5. 关闭资源
  inputStream.close
  socket.close
  serverSocket.close
  println("接收完毕")


}

object ClientTest extends App {
  //1. 创建Socket对象,指明服务器端ip和端口号
  private val address: InetAddress = InetAddress.getByName("127.0.0.1")
  private val socket = new Socket(address, 8899)

  //2. 获取输出流
  private val outputStream: OutputStream = socket.getOutputStream

  //3. 写出数据
  outputStream.write("你好,大王...".getBytes)

  //4. 关闭资源
  outputStream.close
  socket.close
  println("已发送")

}

// 案例二 客户端发送文件给服务端,服务端将文件报错到本地
object ServerSocketTest1 extends App {
  //1. 创建ServerSocket,指定端口号
  private val serverSocket = new ServerSocket(8899)

  //2. 获取Socket实例
  private val socket: Socket = serverSocket.accept

  //3. 获取输入流
  private val inputStream: InputStream = socket.getInputStream

  //4. 读取数据 + 保存到本地
  private val fileOutputStream = new FileOutputStream("sparkcore/src/main/data/yann架构图3.png")

  private val bytes = new Array[Byte](1024)
  private var i: Int = inputStream.read(bytes)
  while (i != -1) {
    fileOutputStream.write(bytes, 0, i)
    i = inputStream.read(bytes)
  }

  //5. 获取客户端信息
  println(s"客户端信息 IP:${socket.getInetAddress} hostname:${socket.getInetAddress.getHostName}")

  //5. 关闭资源
  inputStream.close
  socket.close
  serverSocket.close
  println("接收完毕")


}

object ClientTest1 extends App {
  //1. 创建Socket对象,指明服务器端ip和端口号
  private val address: InetAddress = InetAddress.getByName("127.0.0.1")
  private val socket = new Socket(address, 8899)

  //2. 获取输出流
  private val outputStream: OutputStream = socket.getOutputStream

  //3. 读取图片数据 + 写入数据
  private val fileInputStream = new FileInputStream("sparkcore/src/main/data/yarn架构图.png")
  private val bytes = new Array[Byte](1024)
  private var i: Int = fileInputStream.read(bytes)
  while (i != -1) {
    outputStream.write(bytes, 0, i)
    i = fileInputStream.read(bytes)
  }

  //4. 关闭资源
  outputStream.close
  socket.close
  println("已发送")

}

// 案例三 客户端发送消息,服务端接收消息后响应(聊天室)
object ServerSocketTest2 extends App {
  //1. 创建ServerSocket,指定端口号
  private val serverSocket = new ServerSocket(8899)
  println("服务器已开启")

  //2. 获取Socket实例
  private val socket: Socket = serverSocket.accept

  //3. 获取输入流 输出流
  private val reader = new BufferedReader(new InputStreamReader(socket.getInputStream))
  private val writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream))

  //4. 读取数据
  private var mes: String = reader.readLine

  while (mes != null) {
    println(s"${socket.getInetAddress.getHostName} : ${mes}")
    mes = reader.readLine
  }

  //5. 关闭资源
  reader.close
  writer.close
  socket.close
  serverSocket.close
  println("接收完毕")

}

object ClientTest2 extends App {
  //1. 创建Socket对象,指明服务器端ip和端口号
  private val address: InetAddress = InetAddress.getByName("127.0.0.1")
  private val socket = new Socket(address, 8899)
  println("客户端已开启")

  //3. 获取输入流 输出流
  private val reader = new BufferedReader(new InputStreamReader(socket.getInputStream))
  private val writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream))
  // 获取 stdin
  private val stdin: BufferedReader = new BufferedReader(new InputStreamReader(System.in))

  //4. 读取数据
  println("请输入...按q退出")
  private var line: String = stdin.readLine
  while (line.contains("q") != true) {
    writer.write(line + "\n")
    writer.flush
    line = stdin.readLine
    println("发送成功")
  }

  //4. 关闭资源
  stdin.close
  reader.close
  writer.close
  socket.close
  println("已发送")

}
复制代码

 

posted @   学而不思则罔!  阅读(33)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示