高级API快速入门之本地模拟下载文件【06】

一、控制台版本无线循环聊天(服务器&客户端)

服务端:

package com.zking.test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
 * TCP传输协议中服务器端
 * 
 * @author Administrator
 *
 */
public class ServerTest {
	public static void main(String[] args) throws Exception {
		System.out.println("---------------服务器端---------------------");
		// 1.使用ServerSocket来开启一个服务器
		ServerSocket ss = new ServerSocket(7979);
		System.out.println("服务器开启成功,等待客户端链接.....");
		// 2.接收指定的客户端
		Socket sk = ss.accept();
		System.out.println("某客户端已链接成功服务器");
		// 接收客户端发送的消息
		InputStream is = sk.getInputStream();
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		// 回复消息给客户端去
		OutputStream os = sk.getOutputStream();
		OutputStreamWriter oos = new OutputStreamWriter(os);
		BufferedWriter bw = new BufferedWriter(oos);
		// 写
		Scanner sc = new Scanner(System.in);
		while (true) {
			// 读取
			String readLine = br.readLine();
			System.out.println("客户端说: " + readLine);			
			if("bye".equalsIgnoreCase(readLine)) {
				System.out.println("我也下线");
				break;
			}			
			System.out.println("我是服务器,请输入您要发送给客户端的内容: ");
			String str = sc.next();
			bw.write(str);
			bw.newLine();// 跨行
			bw.flush();// 刷新缓冲区		
		}
	}
}

客户端:

package com.zking.test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
/**
 * 客户端
 * 
 * @author Administrator
 *
 */
public class ClientTest {
	public static void main(String[] args) throws Exception {
		System.out.println("---------------客户端--------------");
		// 1.利用套接字Socket来实现链接指定的服务器
		Socket sk = new Socket("127.0.0.1", 7979);
		System.out.println("客户端开启,成功连上服务器");
		// 需求:有客户端先发送消息给服务器端
		/**
		 * 利用套接字Socket获取输出流方可发送消息到服务器段
		 */
		OutputStream os = sk.getOutputStream();
		OutputStreamWriter oos = new OutputStreamWriter(os);
		BufferedWriter bw = new BufferedWriter(oos);
		// 客户端接受服务器端回复的消息
		InputStream is = sk.getInputStream();
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		// 写
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.println("我是客户端,请输入您要发送给服务器端的内容: ");
			String str = sc.next();
			bw.write(str);
			bw.newLine();// 跨行
			bw.flush();// 刷新缓冲区		
			//equalsIgnoreCase 比较2个字符串是否相同   不区分大小写
			if("bye".equalsIgnoreCase(str)) {
				System.out.println("bybye,下线了。");
				break;
			}
			// 读取
			String readLine = br.readLine();
			System.out.println("服务器说说: " + readLine);
		}	
		//关闭所有流
		br.close();
		isr.close();
		is.close();
		bw.close();
		oos.close();
		os.close();
		sk.close();
	}
}

二、控制台版本:文件下载器
    文件的下载是指客户端从服务器端下载一个文件到客户端;
    比如LOL的客户端,是要去LOL的官方服务器上把客户端的安装包下载到本地后再安装。


    -------------【总思路】--------------
          1.启动服务器并且等待客户端上线
          2.客户端连接服务器
          3.客户端告知服务器要下载的文件名
          4.服务器接收文件名并在本地找到对应文件 
          5.服务器将该文件从硬盘读到内存中,再写入网络中 
          6.客户端从网络上下载该文件,并保存到本地 
          7.关闭连接

服务端:

package com.zking.test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 手机应用市场APP服务器端
 * @author Administrator
 *
 */
public class FileServerTest {

	public static void main(String[] args) throws Exception{
		System.out.println("-------------------手机应用市场APP服务端----------------");
		//开启服务器
		ServerSocket ss = new ServerSocket(9999);
		System.out.println("服务器已开启");
		Socket sk = ss.accept();
		System.out.println("\t\t客户端上线了");	
		//接受客户端发送过来的程序的链接
		InputStream is = sk.getInputStream();
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		//读取
		String path = br.readLine();//程序的路径
		//利用发送过来的文件(程序)的路径拿到程序
		File file = new File(path);	
		FileInputStream fis = new FileInputStream(file);
		BufferedInputStream bis = new BufferedInputStream(fis);	
		//利用socket套接字将输出流获取
		OutputStream os = sk.getOutputStream();
		BufferedOutputStream bos = new BufferedOutputStream(os);	
		System.out.println("文件的内容: ");
		int len = 0;
		while(-1!=(len = bis.read())) {
//			System.out.print((char)len);
			bos.write(len);
			bos.flush();
		}		
		bos.close();
		os.close();
		bis.close();
		fis.close();
		br.close();
		isr.close();
		is.close();
		sk.close();
		ss.close();		
	}
}

 客户端:

package com.zking.test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
/**
 * 手机应用市场客户端(手机)
 * @author Administrator
 *
 */
public class FileClientTest {
	public static void main(String[] args) throws Exception{
		System.out.println("----------------APP客户端-----------------");
		//开启一个应用市场APP程序   客户端
		Socket sk = new Socket("127.0.0.1", 9999);
		System.out.println("客户端成功链接");	
		//下载LOL.txt
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入您要下载程序的路径");
		String path = sc.next();//D:\\lol.txt
		//可以通过套接字Socket中的网络流将程序的路径发送给服务器中
		OutputStream os = sk.getOutputStream();
		OutputStreamWriter osw = new OutputStreamWriter(os);
		BufferedWriter bw = new BufferedWriter(osw);	
		bw.write(path);
		bw.newLine();
		bw.flush();	
		//读取出来  然后下载到某个路径即可。
		//获取Socket中的网络字节输入流
		InputStream is = sk.getInputStream();
		//输入流转换成缓冲输入流
		BufferedInputStream bis =new BufferedInputStream(is);		
		System.out.println("请您选择保存的地址: ");
		String str = sc.next();
		File file = new File(str);
		//写
		FileOutputStream fos = new FileOutputStream(file);
		BufferedOutputStream bos = new BufferedOutputStream(fos);	
		//边读边写
		int len = 0;
		while(-1!=(len = bis.read())) {
			bos.write(len);
			bos.flush();
		}	
		System.out.println("下载成功");
		bos.close();
		fos.close();
		bis.close();
		is.close();
		bw.close();
		osw.close();
		os.close();
		sk.close();
		sc.close();		
	}
}

三、窗体版:聊天(服务器&客户端) 

服务端:

package com.zking.test;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * QQ服务器端
 * @author Administrator
 *
 */
public class QQServerTest extends JFrame{
	
	private ServerSocket ss = null;
	private Socket sk = null;
	
	private JPanel jpa = new JPanel();
	private JLabel jla = new JLabel("端口号");
	private JTextField jtfa = new JTextField(8);
	private JButton jba = new JButton("启动服务器");
	
	
	private JTextArea jta = new JTextArea();
	private JScrollPane jsp = new JScrollPane(jta);
	
	private JPanel jpb = new JPanel();
	private JTextField jtfb = new JTextField(15);
	private JButton jbb = new JButton("发送");
	private JButton jbc = new JButton("接收");
	
	public QQServerTest() {
		this.setTitle("QQ服务器端");
		this.setSize(400, 500);
		this.setDefaultCloseOperation(3);
		this.setLocationRelativeTo(null);
		
		jpa.add(jla);
		jpa.add(jtfa);
		jpa.add(jba);
		jtfa.setText(8989+"");
		jta.setFont(new Font("宋体", Font.BOLD, 18));
		jta.setEditable(false);
		
		jpb.add(jtfb);
		jpb.add(jbb);
		jpb.add(jbc);
		
		this.getContentPane().add(jpa,"North");
		this.getContentPane().add(jsp,"Center");
		this.getContentPane().add(jpb,"South");
		
		/**
		 * 启动服务的点击事件jba
		 */
		jba.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				
				//获取端口号
				String dk = jtfa.getText();
				Integer port = Integer.valueOf(dk);
				//append
				jta.append("服务器正在启动中....\n");
				try {
					//开启服务器  ServerSocket
					ss = new ServerSocket(port);
					jta.append("服务器启动成功...等待客户端链接....\n");
					
				} catch (Exception e2) {
					e2.printStackTrace();
				}
				
				//利用明天的知识——多线程(小弟)
				new Thread() {
					public void run() {
						while(true) {
							try {
								sk = ss.accept();
							} catch (IOException e) {
								e.printStackTrace();
							}
							jta.append("某客户端上线了....\n");
						}
					};
				}.start();	
				//实现自动接收数据--只要在服务器启动的那一刻,拿取一个线程(小弟弟)自动帮我接收数据并显示。
				new Thread() {
					public void run() {
						while(true) {
							//让小弟先休息一下
							try {
								Thread.sleep(500);
							} catch (InterruptedException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
							if (sk != null) {
								try {
									InputStream is = sk.getInputStream();
									InputStreamReader isr = new InputStreamReader(is);
									BufferedReader br = new BufferedReader(isr);

									String content = br.readLine();
									jta.append("客户端说: " + content + "\n");

								} catch (IOException e1) {
									// TODO Auto-generated catch block
									e1.printStackTrace();
								}
							}
						}
					};
				}.start();	
			}
		});
		
		/**
		 * 服务器端回复消息给客户端  jbb
		 */
		jbb.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				//获取发送的内容
				String content = jtfb.getText();
				//客户端中获取网络输出流  利用Socket
				if(sk!=null) {
					//获取网络流
					try {
						OutputStream os = sk.getOutputStream();
						OutputStreamWriter osw = new OutputStreamWriter(os);
						BufferedWriter bw = new BufferedWriter(osw);
						//写入
						bw.write(content);
						bw.newLine();
						bw.flush();
						jta.append("我说:"+content);
						
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}else {
					JOptionPane.showMessageDialog(null, "客户端没有链接服务器,不能发送消息");
				}
			}
		});
		/**
		 * 服务器端接受客户端发送的内容 jbb
		 */
		jbc.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				if (sk != null) {
					try {
						InputStream is = sk.getInputStream();
						InputStreamReader isr = new InputStreamReader(is);
						BufferedReader br = new BufferedReader(isr);

						String content = br.readLine();
						jta.append("客户端说: " + content + "\n");

					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
			}
		});		
		this.setVisible(true);
	}	
	public static void main(String[] args) {
		new QQServerTest();
	}

}

客户端:

package com.zking.test;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * QQ客户端
 * 
 * @author Administrator
 *
 */
public class QQClientTest extends JFrame {

	// 定义一个Socket套接字
	private Socket sk = null;

	private JPanel jpa = new JPanel();
	private JLabel jla = new JLabel("IP地址");
	private JTextField jtfa = new JTextField(12);
	private JLabel jlb = new JLabel("端口号");
	private JTextField jtfb = new JTextField(8);
	private JButton jba = new JButton("链接服务器");

	private JTextArea jta = new JTextArea();
	private JScrollPane jsp = new JScrollPane(jta);

	private JPanel jpb = new JPanel();
	private JTextField jtfc = new JTextField(15);
	private JButton jbb = new JButton("发送");
	private JButton jbc = new JButton("接收");

	public QQClientTest() {
		this.setTitle("QQ客户端");
		this.setSize(500, 500);
		this.setDefaultCloseOperation(3);
		this.setLocationRelativeTo(null);

		jpa.add(jla);
		jpa.add(jtfa);
		jpa.add(jlb);
		jpa.add(jtfb);
		jpa.add(jba);

		jpb.add(jtfc);
		jpb.add(jbb);
		jpb.add(jbc);

		this.getContentPane().add(jpa, "North");
		this.getContentPane().add(jsp, "Center");
		this.getContentPane().add(jpb, "South");

		/**
		 * 客户端的jba点击事件
		 */
		jba.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				String ip = jtfa.getText();
				int port = Integer.valueOf(jtfb.getText());
				jta.append("客户端即将来连接服务器\n");
				//
				try {
					sk = new Socket(ip, port);
					jta.append("链接服务器成功了....\n");
				} catch (Exception e2) {
					e2.printStackTrace();
				}
				
				//开启一个多线程实现自动接收数据
				new Thread() {
					public void run() {
						while(true) {
							try {
								Thread.sleep(500);
							} catch (InterruptedException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
							if (sk != null) {
								try {
									InputStream is = sk.getInputStream();
									InputStreamReader isr = new InputStreamReader(is);
									BufferedReader br = new BufferedReader(isr);

									String content = br.readLine();
									jta.append("服务器说: " + content + "\n");

								} catch (IOException e1) {
									// TODO Auto-generated catch block
									e1.printStackTrace();
								}
							}
						}
					};
				}.start();
			}
		});
		/**
		 * 客户端的发送按钮jbb
		 */
		jbb.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// 获取发送的内容
				String content = jtfc.getText();
				// 客户端中获取网络输出流 利用Socket
				if (sk != null) {
					// 获取网络流
					try {
						OutputStream os = sk.getOutputStream();
						OutputStreamWriter osw = new OutputStreamWriter(os);
						BufferedWriter bw = new BufferedWriter(osw);
						// 写入
						bw.write(content);
						bw.newLine();
						bw.flush();
						jta.append("我:" + content+"\n");

					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}

				} else {
					JOptionPane.showMessageDialog(null, "客户端没有链接服务器,不能发送消息");
				}
			}
		});

		/**
		 * 客户端接收服务器端回复的消息
		 */
		jbc.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				if (sk != null) {
					try {
						InputStream is = sk.getInputStream();
						InputStreamReader isr = new InputStreamReader(is);
						BufferedReader br = new BufferedReader(isr);

						String content = br.readLine();
						jta.append("服务器说: " + content + "\n");

					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
			}
		});
		this.setVisible(true);
	}
	public static void main(String[] args) {
		new QQClientTest();
	}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ning_ning_03

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

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

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

打赏作者

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

抵扣说明:

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

余额充值