在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
程序功能: 客户端向服务器发送一个本地磁盘中的文件, 服务器程序接受后保存在其他位置. 客户端实现步骤:
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 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 } 运行结果:
|
请发表评论