黑马程序员-TCP上传图片-多线程并发上传图片-客户端并发登陆-自定义服务器

---------------------- android培训、java培训、期待与您交流! ---------------------- 
TCP练习(上传图片)
/**
 * 上传图片
 * 客户端
 * 1.服务端点
 * 2.读取客户端已有的图片数据。
 * 3.通过socket输出流将数据发给服务端。
 * 4.读取服务端反馈信息。
 * 5.关闭。
 * @author onlin_000
 *
 */
public class TcpUploadingPiceClient {

	public static void main(String[] args) throws Exception {
		Socket s = new Socket(InetAddress.getByName("192.168.1.111"),10005);
		FileInputStream fis = new FileInputStream(new File("test.bmp"));
		OutputStream ous = s.getOutputStream();
		byte[] buf =new byte[1024];
		int len = 0;
		while((len = fis.read(buf)) != -1){
			ous.write(buf, 0, len);
		}
		s.shutdownOutput();
		InputStream ins = s.getInputStream();
		int i =ins.read(buf);
		System.out.println(new String(buf,0,i));
		ous.close();
		fis.close();
		s.close();
		ins.close();
	}
}
服务端:
public class TcpUploadingPiceServer {

	public static void main(String[] args) throws Exception {
		ServerSocket ss = new ServerSocket(10005);
		Socket s = ss.accept();
		FileOutputStream fos = new FileOutputStream(new File("Server.bmp"));
		InputStream ins = s.getInputStream();
		byte[] data = new byte[1024];
		int len = 0;
		while((len = ins.read(data)) != -1){
			fos.write(data,  0, len);
		}
		OutputStream outs = s.getOutputStream();
		outs.write("上传成功!".getBytes());
		fos.close();
		ins.close();
		outs.close();
		s.close();
		ss.close();
		
	}
}



TCP练习(多线程并发上传图片)
服务端:
/**
 * 让多个客户端用户能够同时并发上传文件
 * 那么服务端最好就将每个客户端封装到一个单独的线程中,这样就可以同时处理对个客户端的请求。
 * 
 *如何定义线程呢?
 *只要明确了每一个客户端要在服务端执行的代码。
 * @author onlin_000
 *
 */
public class TcpUploadingByThreadServer {

	public static void main(String[] args) {
		while(true){
			ServerSocket ss = null;
			try {
				ss = new ServerSocket(10006);
				Socket s = ss.accept();
				new Thread(new clientByThread(s)).start();
			} catch (IOException e) {
				throw new RuntimeException("服务器启动失败!");
			}finally{
				try {
					ss.close();
				} catch (IOException e) {
					throw new RuntimeException("服务器关闭失败!");
				}
			}
		}
		
	}
}
class clientByThread implements Runnable{

	Socket s;
	clientByThread(Socket s){
		this.s = s;
	}
	@Override
	public void run() {
		String ip = s.getInetAddress().getHostAddress();
		int count = 0;
		try {
			File file = new File("server\\"+ ip + "(" + count + ")"+".bmp");
			while(file.exists()){
				file = new File("server\\"+ ip + "(" + (++count) + ")"+".bmp");
			}
			FileOutputStream fos = new FileOutputStream(file);
			InputStream ins = s.getInputStream();
			byte[] data = new byte[1024];
			int len = 0;
			while((len = ins.read(data)) != -1){
				fos.write(data,  0, len);
			}
			OutputStream outs = s.getOutputStream();
			outs.write("上传成功!".getBytes());
			fos.close();
			ins.close();
			outs.close();
			s.close();
		} catch (Exception e) {
			throw new RuntimeException(ip +"上传失败!");
		}
	}
客户端;
public class TcpUploadingByThreadClient {

	public static void main(String[] args) {
		try {
			Scanner sc = new Scanner(System.in);
			System.out.println("请输入图片路径,请用\\\\代替\\");
			String path = sc.nextLine();
			sc.close();
			File file = new File(path);
			if(!file.exists()){
				System.out.println("请输入正确的路径");
				return;
			}
			if(!file.getName().endsWith(".bmp")||file.getName().endsWith(".BMP")){
				System.out.println("请选择正确的文件");
				return;
			}
			if(file.length()>1024*1024*5){
				System.out.println("文件太大!");
				return;
			}
			Socket s = new Socket(InetAddress.getByName("192.168.1.111"),10006);
			FileInputStream fis = new FileInputStream(file);
			OutputStream ous = s.getOutputStream();
			byte[] buf =new byte[1024];
			int len = 0;
			while((len = fis.read(buf)) != -1){
				ous.write(buf, 0, len);
			}
			s.shutdownOutput();
			InputStream ins = s.getInputStream();
			int i =ins.read(buf);
			System.out.println(new String(buf,0,i));
			ous.close();
			fis.close();
			s.close();
			ins.close();
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
}





TCP练习(客户端并发登录)
/**
 * 客户端通过键盘录入用户名。
 * 服务端对这个用户名进行校验。
 * 
 * 如果该用户名存在,在服务器端显示xxx已登录。
 * 并在客户端显示xxx欢迎光临。
 * 
 * 如果该用户不存在,正在服务器端显示xxx尝试登录。
 * 并在客户端显示xxx用户不存在
 * @author onlin_000
 *
 */
public class TcpLoadServer {

	public static void main(String[] args) {
		ServerSocket ss = null;
		try {
			ss = new ServerSocket(10006);
			while(true){
				Socket s = ss.accept();
				new Thread(new LoadServer(s)).start();
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
}
class LoadServer implements Runnable{
	Socket s;
	LoadServer( Socket s){
		this.s = s;
	}
	@Override
	public void run() {
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip + "..............connected");
		BufferedReader bufin = null;
		try {
			bufin = new BufferedReader(new FileReader(new File("User.txt")));
			BufferedReader buf = 
					new BufferedReader(new InputStreamReader(s.getInputStream()));
			PrintWriter pw = 
					new PrintWriter(s.getOutputStream(),true);
			for(int i = 0; i < 3; i++){
				boolean flag = false;
				String name = buf.readLine();
				if(name == null)
					return;
				String data = null;
				while((data = bufin.readLine()) != null){
					if(name.equals(data))
						flag = true;
				}
				if(flag){
					System.out.println(name + "登录成功");
					pw.println("欢迎" + name + "登录成功");
				}else{
					System.out.println(name + "尝试登录");
				}
			}
			buf.close();
			pw.close();
			bufin.close();
		} catch (Exception e) {
			throw new RuntimeException(ip + "登录失败");
		}
	}
	
}
客户端:
public class TcpLoadClient {

	public static void main(String[] args) {
		BufferedReader bufin = null;
		try {
			bufin = new BufferedReader( new InputStreamReader(System.in));
			Socket s = new Socket(InetAddress.getByName("192.168.1.111"),10006);
			BufferedReader buf = 
					new BufferedReader(new InputStreamReader(s.getInputStream()));
			PrintWriter pw =
					new PrintWriter(s.getOutputStream(),true);
			String name = null;
			while((name = bufin.readLine())!= null){
				
				if(name.equals("over"))
					return;
				pw.println(name);
				String re = buf.readLine();
				if(re.contains("欢迎"))
					System.out.println(re);
				pw.close();
				buf.close();
				s.close();
			}
		} catch (Exception e) {
			throw new RuntimeException("客户端异常");
		}
	}
}

自定义浏览器-Tomcat服务器
public class ServerDemo {

	public static void main(String[] args) {
		ServerSocket ss;
		try {
			ss = new ServerSocket(10010);
			Socket s = ss.accept();
			System.out.println(s.getInetAddress().getHostAddress() + "...............connected");
			PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
			pw.println("Hello celient!");
			ss.close();
			s.close();
		} catch (IOException e) {
			throw new RuntimeException("服务端创建失败");
		}
	}
}

黑马程序员-TCP上传图片-多线程并发上传图片-客户端并发登陆-自定义服务器_第1张图片
域名解析
1.客户机提出域名解析请求,并将该请求发送给本地的域名服务器。
2.当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。
3.如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址。
4.本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。
5.重复第四步,直到找到正确的纪录。
6.本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。

---------------------- android培训、java培训、期待与您交流! ---------------------- 

你可能感兴趣的:(黑马程序员-TCP上传图片-多线程并发上传图片-客户端并发登陆-自定义服务器)