java 上传和多线程接收文本文件和图片

开始时间:2018年9月18日10:20:52

结束时间:2018年9月18日12:32:12

累计时间:2

    今天吧坑补上吧,这一篇啥也没写 骗了60访问量,良心过不去了。

转换文本格式

功能: 客户端向服务器端发送字符,服务器端转化为大写返回

服务器端代码

public class TcpServer {
	public static void main(String[] args) throws IOException {
		/* (1)准备服务: 
		 (2)accept: 获得客户单的服务: 
		 (3)客户端的服务: 获得输入流: 读取客户端发送过来的数据: 
		 (4)转换成大写: 
		 (5)获得输出流, 将大写的文本写入输出流: 
		 */
		ServerSocket ss = new ServerSocket(9999);
		Socket s = ss.accept();
//		获取输入流 读取客户端发送过来的信息
		BufferedReader bufIn = new BufferedReader(
				new InputStreamReader(s.getInputStream()));
//		向客户端响应数据
		PrintWriter out = new PrintWriter(s.getOutputStream(),true);
		String line = null;
		while((line=bufIn.readLine())!=null)
		{
			System.out.println(line);
			out.println(line.toUpperCase());
		}
		s.close();
		ss.close();
				
				
		
	}

}

客户端代码

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClient {
	public static void main(String[] args) throws UnknownHostException, IOException {
		
		Socket s=new Socket("192.168.1.118",9999);
//	自定义键盘录入对象
		BufferedReader bufr=new BufferedReader(
				new InputStreamReader(System.in));
//		装饰设计模式,王输出流中写入数据
		PrintWriter out = new PrintWriter(s.getOutputStream(),true);
		
//		读取服务器响应过来的数据:流
		BufferedReader bufIn = new BufferedReader(
				new InputStreamReader(s.getInputStream()));
		String line = null;
		while((line=bufr.readLine())!=null )
		{
			if("over".equals(line))
			{
				break;
			}
			out.println(line);
//			循环读取响应回来的数据
			String str = bufIn.readLine();
			System.out.println("server  "+str);
		}
		bufr.close();
		s.close();
	}
	
	

}

cmd 命令:

1 先换盘  输入e:

2 cd表示进入该目录 输入该文件 class 所在的bin目录  如下图

补充cmd实用命令:

1 start  进入当前目录

2 cd 进入目录( 如 e:)

3 Ctrl + c 重启

提示:如果是在本地运行服务器,每次启动IP地址会变化,需要重新查看Ip。

运行效果如上图 

上传文本文件 

         客户端:

             (1)服务
             (2)获得输入流: 读取文件: 
             (3)获得输出流: 将数据写入到输出流当中。 
             (4)继续获得输入流: 读取服务器响应回来的数据。 
 代码:

package com.yidongxueyuan.tcp;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TextClient {
	public static void main(String[] args) throws UnknownHostException, IOException {
		/*
		 *  
		 */
		
		
		Socket s= new Socket("192.168.2.218",9999);
		
		FileReader fr = new FileReader("C:/Users/Mrzhang/javaEE/javaSE-08/javaSE-32/javaList.txt");
		
		//准备输出流:  向流当中的写数据: 
		PrintWriter out = new PrintWriter(s.getOutputStream(),true);//
		
		//准备一个流: 准备读取数据: 
		BufferedReader bufIn = 
				new BufferedReader(new InputStreamReader(s.getInputStream()));
		
		char ch[] = new char[1024];
		int len=0; 
		while((len=fr.read(ch))!=-1){//将数据读取放在字符数组当中: 
			//循环写出去: 
			out.println(ch);
		}
		s.shutdownOutput();//告知服务器端,文件已经读取完毕: 
		
		//读取响应回来的数据: 
		String line = bufIn.readLine();
		System.out.println(line);
		
	}
}

    s.shutdownOutput();//告知服务器端,文件已经读取完毕: 

这一步如果没有的话,会出现客户端和服务器端同时等待的情况

服务端:

            (1)服务:
            (2)获得客户端的服务“: 
            (3)获得输入流, 读取流当中的数据。 
            (4)输出流: 将数据找个位置保存起来。
            (5)准备输出流, 给客户端响应。 

package com.yidongxueyuan.tcp;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TextServer {
	public static void main(String[] args) throws IOException {
		/*
		 * 

		 */
		
		int port = 9999;
		ServerSocket ss = new ServerSocket(port);
		
		Socket s = ss.accept();
		
		// 获得流,读取流当中的数据》 客户端发送的数据。 
		BufferedReader bufIn = 
				new BufferedReader(new InputStreamReader(s.getInputStream()));
		
		//将读取的文件数据保存起来: 
		PrintWriter out = new PrintWriter(new File("C:/Users/Mrzhang/javaEE/javaSE-07/javaSE-52/copy.txt"));// 
		
		//准备一个流: 给客户端响应数据: 
		
		int  num= 0;
		char ch[]= new char[1024];
		while((num=bufIn.read(ch))!=-1){
			//将数组当中的内容写出去: 
			out.println(ch); 
			out.flush(); 
		}
		//告知客户端, 数据已经读取完毕。 
		s.shutdownInput();
		
		
		//响应数据:
		PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
		pw.println("文本上传成功:谢谢");
		
		
		
		
	}
}

上传图片原理类似,只放代码

客户端:

package com.yidongxueyuan.tcp;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class PicClient {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket s= new Socket("192.168.2.218",10009);
		//字节输入流: 读取图片文件: 
		FileInputStream fis = new FileInputStream(new File("C:/Users/Mrzhang/Desktop/API/a练习图片/XXX.jpg"));
		
		InputStream in = s.getInputStream();
		
		//准备流,写到输出: 
		OutputStream out = s.getOutputStream();
		byte buf[]= new byte[1024];
		int len=0; 
		while((len=fis.read(buf))!=-1){// IO 
			out.write(buf,0,len);
		}
		
		//告知服务器写完: 
		s.shutdownOutput(); 
		
		//读取相应回来的数据: 
		byte b[]= new byte[1024]; 
		int num = in.read(b);
		System.out.println(new String(b,0,num));
		
		s.close();
		
	}
}

服务器端:

package com.yidongxueyuan.tcp;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class PicServer {
	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(6666);
		//accept: 获得客户端的服务: 
		Socket s = ss.accept();
		
		InputStream in = s.getInputStream();
		FileOutputStream fos = new FileOutputStream(new File("C:/Users/Mrzhang/javaEE/javaSE-07/javaSE-52/yourWife.jpg"));
		
        byte buf []= new byte[1024];
        int len=0; 
        while((len=in.read(buf))!=-1){
        	fos.write(buf, 0, len);
        }
        s.shutdownInput(); 
        
        //准备流: 相应数据: 
        OutputStream out = s.getOutputStream();
        out.write("您上传的图片已经收到了xiexie~".getBytes());
        
        s.close();
        ss.close();
        
        
        
        
	}
}

 多线程技术上传

问题: 服务器端只能处理一个客户端,当B客户端发送来请求时候,如果服务器端没有处理完A请求,B只能等待。  
 。 
五: 服务器端多线程解决多个客户端请求: 图片上传: 
  (1)客户端,跟之前的一致。 
  (2)服务器端,使用多线程技术:  同时处理多个客户端请求。 

package com.yidongxueyuan.tcp;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class PicThread implements Runnable {
	
	private Socket s; // 处理不同的客户端: 
	
	public PicThread( Socket s){
		this.s=s; 		
	}
	
	int count =1; //计数
	@Override
	public void run() {
		
		
		//定义一个流: 获得数据
		try {
			String ip= s.getInetAddress().getHostAddress();
			
		    InputStream in= s.getInputStream();
		    //封装了一个父路径: 
		    File parent = new File("C:/Users/Mrzhang/javaEE/javaSE-07/javaSE-52");
		    //整体的路径: 
		    
		    File file = new File(parent, ip+(count++)+".jpg");
		    
		    while(file.exists())//加判断,文件存在,文件名称重新赋值。 
		    	   file = new File(parent, ip+(count++)+".jpg");
		    
		    FileOutputStream fos = new FileOutputStream(file); 
		    byte b[]= new byte[1024];
		    int len =0 ; 
		    while((len= in.read(b))!=-1){
		    	fos.write(b,0,len);
		    }
		    
		    s.shutdownInput(); 
		    
		    OutputStream out = s.getOutputStream();
		    out.write("上传成功".getBytes());
		   
		    
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

}

测试

package com.yidongxueyuan.tcp;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class TestPicThread {
   public static void main(String[] args) throws IOException {
	 ServerSocket ss= new ServerSocket(10009);
	
	 while(true){
		 Socket s= ss.accept();
		 
		 new Thread(new PicThread(s)).start(); 
		 
	 }
 }
}

后期可以加一些过滤之类的~

 

2018年9月18日12:31:15于易动

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方-教育技术博主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值