要求

客户端向服务端传输一个文件,服务端接受文件之后将文件保存在本地,并向客户端返回 接收成功 的信息,客户端接收到信息之后将信息打印到控制台上。

分析

客户端向服务器传输文件,实质上就是将本地的文件变成文件流,然后写入到SocketOutputStream
然后服务器将OutputStream写入到文件流中,进行保存文件的操作。
服务端向客户端返回信息,只用拿到客户端的Socket 然后把返回的信息写入OutputStream中就可以了。
客户端接收服务端返回的信息,只需要在传输完文件之后去获取客户端SocketInputStream(会一直等待服务器),然后把流里面的内容转成字符串就可以了。

注意

由于数据是在网络中传输的,服务端读取流的时候是无法while_((_len = inputStream.read_(_buffer_)) _!= -1_)_ 来判断流是否结束的(本地文件可以有EOF),因此,需要我们在客户端传输数据结束之后,给服务端一个结束的信号socket.shutdownOutput_()_

代码

  1. package test21;
  2. import org.junit.Test;
  3. import java.io.*;
  4. import java.net.InetAddress;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;
  7. /**
  8. * Created By Intellij IDEA
  9. *
  10. * @author Xinrui Yu
  11. * @date 2021/12/5 21:10 星期日
  12. */
  13. public class SocketServerTest2 {
  14. @Test
  15. public void client(){
  16. Socket socket = null;
  17. FileInputStream fileInputStream = null;
  18. BufferedInputStream bufferedInputStream = null;
  19. InputStream inputStream = null;
  20. try{
  21. fileInputStream = new FileInputStream("img.jpg");
  22. bufferedInputStream = new BufferedInputStream(fileInputStream);
  23. InetAddress ip = InetAddress.getByName("127.0.0.1");
  24. socket = new Socket(ip,8080);
  25. OutputStream outputStream = socket.getOutputStream();
  26. byte[] buffer = new byte[1024];
  27. int len;
  28. while((len = bufferedInputStream.read(buffer)) != -1){
  29. outputStream.write(buffer,0,len);
  30. }
  31. socket.shutdownOutput();
  32. inputStream = socket.getInputStream();
  33. byte[] buffer2 = new byte[1024];
  34. int len2;
  35. while((len2 = inputStream.read(buffer2)) != -1){
  36. String str = new String(buffer2,0,len2);
  37. System.out.print(str);
  38. }
  39. }catch (IOException e){
  40. e.printStackTrace();
  41. }finally {
  42. if(bufferedInputStream != null){
  43. try {
  44. bufferedInputStream.close();
  45. } catch (IOException e) {
  46. e.printStackTrace();
  47. }
  48. }
  49. if(inputStream != null){
  50. try {
  51. inputStream.close();
  52. } catch (IOException e) {
  53. e.printStackTrace();
  54. }
  55. }
  56. if(socket != null){
  57. try {
  58. socket.close();
  59. } catch (IOException e) {
  60. e.printStackTrace();
  61. }
  62. }
  63. }
  64. }
  65. @Test
  66. public void server(){
  67. ServerSocket serverSocket = null;
  68. BufferedOutputStream bufferedOutputStream = null;
  69. InputStream inputStream = null;
  70. OutputStream outputStream = null;
  71. try{
  72. FileOutputStream fileOutputStream = new FileOutputStream("SocketImage.png");
  73. bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
  74. serverSocket = new ServerSocket(8080);
  75. Socket clientSocket = serverSocket.accept();
  76. inputStream = clientSocket.getInputStream();
  77. int len;
  78. byte[] buffer = new byte[1024];
  79. while((len = inputStream.read(buffer)) != -1){
  80. bufferedOutputStream.write(buffer,0,len);
  81. }
  82. System.out.println("成功收到来自:" + clientSocket.getInetAddress().getHostAddress() + "的图片");
  83. outputStream = clientSocket.getOutputStream();
  84. outputStream.write("照片已收到!谢谢你!".getBytes());
  85. Thread.sleep(3000);
  86. }catch (IOException | InterruptedException e){
  87. e.printStackTrace();
  88. }finally {
  89. if(bufferedOutputStream != null){
  90. try {
  91. bufferedOutputStream.close();
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. }
  95. }
  96. if(inputStream != null){
  97. try {
  98. inputStream.close();
  99. } catch (IOException e) {
  100. e.printStackTrace();
  101. }
  102. }
  103. if(outputStream != null){
  104. try {
  105. outputStream.close();
  106. } catch (IOException e) {
  107. e.printStackTrace();
  108. }
  109. }
  110. if(serverSocket != null){
  111. try {
  112. serverSocket.close();
  113. } catch (IOException e) {
  114. e.printStackTrace();
  115. }
  116. }
  117. }
  118. }
  119. }

运行

服务端等待客户端的连接
image.png

客户端启动之后会等待服务端返回信息
image.png

服务端3s(手动设置的)之后,将返回成功的信息返回给客户端,客户端接收到信息之后打印到控制台,然后程序才会截止。
image.png