JAVA实现C/S结构小程序

程序功能:

客户端向服务器发送一个本地磁盘中的文件, 服务器程序接受后保存在其他位置.

客户端实现步骤:

  1. 创建一个客户端对象Socket,构造方法中绑定服务器的IP地址 和 端口号
  2. 使用Socket对象中的方法 getOutputSteam()获取网络字节输出流OutputStream对象
  3. 使用字节输出流OutputStream对象中的write()方法,给服务器发送数据
  4. 使用Socket对象中的getInputStream()获取网络字节输入流InputStream()对象  
  5. 使用网络字节输入流InputStream对象中的read()方法,读取服务器回写的数据.
  6. 释放Socket资源.
 1 import java.io.*;
 2 import java.net.Socket;
 3 
 4 public class TCPClient {
 5     public static void main(String[] args) throws IOException {
 6             //1.创建一个客户端对线Socket,构造方法中绑定服务器的IP地址和端口号
 7              Socket socket = new Socket("127.0.0.1",8888);
 8            // Socket socket = new Socket("192.168.15.132",8888);
 9             //2.使用Socket对象中的方法getOutputStream(0获取网络字节输出流OutputSteam对象
10             //这个流是个网络流,指向了服务器
11             OutputStream os = socket.getOutputStream();
12             File f = new  File("E:\图片\桌面图片\宋民国\222.jpg");
13             FileInputStream fis = new FileInputStream(f);
14             byte[] bs = new byte[1024];
15             int len;
16             while((len=fis.read(bs))!=-1)
17             {
18                 //3.使用字节输出流OutputSteam对象中的方法write,给服务器发送数据
19                 os.write(bs,0,len);
20             }
21             //告诉服务器关闭输出
22             socket.shutdownOutput();
23             fis.close();
24 
25            //4.使用Socket对象中的方法getInputSteam()获取网络字节输入流InputSteam()对象
26             InputStream is = socket.getInputStream();
27             //5.使用网络字节输入流InputSteam对象中的方法read,读取服务器回写的数据
28             byte[] list = new byte[1024];
29             int len1 = is.read(list);
30             String str1 = new String(list,0,len1);
31             //6.释放资源(Socket)
32             System.out.println(str1);
33             socket.close();//只用关socket就行了
34 
35 
36     }
37 }

服务器端实现步骤:

  1. 创建一个服务器对ServerSocket对象和指定的端口号一致.
  2. 使用ServerSocket对象中的accept方法,获取请求的客户端对象Socket
  3. 使用Socket对象中的getInputSream()方法
  4. 使用网络字节输入流InputStream对象中的read()方法
  5. 使用Socket对象中的getoutputStream()方法
  6. 使用网络字节输出流OutputSteam对象中的write()方法
  7. 释放资源.
  1 import java.io.*;
  2 import java.net.ServerSocket;
  3 import java.net.Socket;
  4 import java.util.Random;
  5 
  6 public class TCPServer {
  7     public static void main(String[] args) throws IOException {
  8 
  9         //method01();
 10         method02();
 11 
 12     }
 13     public static void method02() throws IOException{
 14        //  1.创建一个服务器对ServerSocket对象和指定的端口号要一致.
 15         ServerSocket serverSocket = new ServerSocket(8888);
 16         while(true) {
 17             //2.使用ServerSocket对象中的的方法accept,获取到请求的客户端对象Scoket
 18             // 创建多线程,提高可以同时与多个客户端进行数据的传输,提高效率
 19             Socket socket = serverSocket.accept();//阻塞(如果没有客户端连接,程序会停止在这个地方)
 20             new Thread(() -> {
 21                 try {
 22                     //获得客户端Socket对象
 23                     //给保存的文件设置随机名,避免覆盖
 24                     long time = System.currentTimeMillis();
 25                     //3.使用Socket对象中的方法getInputSteam() 获得输入流
 26                     InputStream is = socket.getInputStream();
 27                     FileOutputStream fos = new FileOutputStream(new File("C:\123\123", time + ".jpg"));
 28                     byte[] list = new byte[1024];
 29                     int len;
 30                     //4.使用网络字节输入流InputStream对象中的read()方法
 31                     while ((len = is.read(list)) != -1) {
 32                         fos.write(list, 0, len);
 33                     }
 34                     fos.close();
 35                     //5. 使用Socket对象中的getoutputStream()方法获得输出流
 36                     OutputStream os = socket.getOutputStream();
 37                     //6.使用网络字节输出流OutputSteam对象中的write()方法
 38                     os.write("你好,图片传输完毕".getBytes());
 39 
 40                     //7. 释放资源
 41                     socket.close();
 42                 } catch (IOException e) {
 43                     e.printStackTrace();
 44                 }
 45             }).start();
 46 
 47         }
 48     }
 49     public static void method01() throws IOException {
 50 
 51         //1.创建一个服务器对ServerSocket对象和系统指定的端口号要一致.
 52         ServerSocket server = new ServerSocket(8888);
 53         /*让服务器一直处于监听状态(死循环accept方法)
 54          * 有一个客户端上传文件,就保存一个文件.
 55          * */
 56         while (true){
 57             /* 在步骤1 与 步骤2 之间会卡主, 等待客户端连接,连接了才会进行下一步*/
 58 
 59             //2.使用ServerSocket对象中的的方法accept,获取到请求的客户端对象Scoket
 60             Socket socket = server.accept();
 61 
 62 
 63             //3.使用Socket对象中的方法getInputSteam()
 64             // 得到一个输入流,该输入流就可以调用read()方法
 65             InputStream is = socket.getInputStream();
 66             // 4.使用网络字节输入流InptuSteam对象中的read
 67 
 68             //文件夹 在是定文件夹下创建文件
 69             File dir = new File("C:\123\123");
 70             /*     //自动生成一个时间戳,自动生成文件名,利用毫秒值当做文件名
 71              *      用System.currentTimeMilis()方法获取当前系统的毫秒值,
 72              *      再加上一个随机数. 保证文件名是不重复的.
 73              * */
 74             long time = System.currentTimeMillis();
 75             String filename =time+new Random().nextInt(1000)+"";
 76             /*如果该文件夹不存在,则生成这个文件夹*/
 77             if(!dir.exists()){
 78                 dir.mkdirs();
 79             }
 80             /**/
 81             FileOutputStream fos = new FileOutputStream(new File(dir,filename+".jpg"));
 82 
 83             //  FileOutputStream fos = new FileOutputStream(destination);
 84             byte[] bs = new byte[1024];
 85             int len;
 86             while((len=is.read(bs))!=-1)
 87             {
 88                 fos.write(bs,0,len);
 89             }
 90             //告诉
 91             fos.close();
 92 
 93 
 94             //5.使用Socket对象中的方法 getoutputSteam 回写 收到了就谢谢.
 95             //利用网络指向客户端.往客户端回写数据.
 96             OutputStream os = socket.getOutputStream();
 97             //都是字节流,转换为字节再写回去.
 98             os.write("收到谢谢".getBytes());
 99             /*socket.close();
100 
101             server.close();*/
102 
103         }
104 
105 
106 
107     }
108 }

运行结果:

原文地址:https://www.cnblogs.com/battlecry/p/9525762.html