一:控制台版本的聊天互发消息

    服务端:

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();}}

二:通过TCP传输协议实现模拟下载本地文件

例如:在电脑上下载我的世界

(1)输入我的世界官网的地址
(2)找到指定的下载器,点击下载
(3)将点击的连接传输到服务器去找。
(4)服务器如果能够查找到该游戏——将游戏读取到内存中。
(5)然后将内存中的游戏写入到网络流中

手机应用市场APP服务器端:

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.txtScanner 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();}}

三:TCP之窗体版聊天及自动接收

QQ服务器端:

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() {@Overridepublic void actionPerformed(ActionEvent e) {//获取端口号String dk = jtfa.getText();Integer port = Integer.valueOf(dk);//appendjta.append("服务器正在启动中....\n");try {//开启服务器  ServerSocketss = 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 blocke.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 blocke1.printStackTrace();}}}};}.start();}});/*** 服务器端回复消息给客户端  jbb*/jbb.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//获取发送的内容String content = jtfb.getText();//客户端中获取网络输出流  利用Socketif(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 blocke1.printStackTrace();}}else {JOptionPane.showMessageDialog(null, "客户端没有链接服务器,不能发送消息");}}});/*** 服务器端接受客户端发送的内容 jbb*/jbc.addActionListener(new ActionListener() {@Overridepublic 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 blocke1.printStackTrace();}}}});this.setVisible(true);}public static void main(String[] args) {new QQServerTest();}}

QQ客户端:

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() {@Overridepublic 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 blocke.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 blocke1.printStackTrace();}}}};}.start();}});/*** 客户端的发送按钮jbb*/jbb.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// 获取发送的内容String content = jtfc.getText();// 客户端中获取网络输出流 利用Socketif (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 blocke1.printStackTrace();}} else {JOptionPane.showMessageDialog(null, "客户端没有链接服务器,不能发送消息");}}});/*** 客户端接收服务器端回复的消息*/jbc.addActionListener(new ActionListener() {@Overridepublic 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 blocke1.printStackTrace();}}}});this.setVisible(true);}public static void main(String[] args) {new QQClientTest();}}

高级API 快速入门之第七章 本地模拟下载文件相关推荐

  1. 高级API 快速入门之第六章 用窗体实现Socket对话聊天案例

    服务端: package com.zking.test;import java.awt.Font; import java.awt.event.ActionEvent; import java.awt ...

  2. 高级API快速入门之群聊天室【09】

    一.控制台版本的群聊天室                     其原理就是:通过死循环进行保存连接服务器的客户端,并创建一个容器来保存所有连接服务器的客户端              服务器: pa ...

  3. qq位置如何用启动百度地图定位服务器,腾讯位置服务API快速入门

    前言 之前项目有个需求,在网页上显示微信发送过来的位置信息,该开始想用百度地图,后来发现腾讯地图相对简单一点 快速入门 申请Key 引入js 把###替换成你申请的key 定义容器 设置好宽高度 设置 ...

  4. OUYA游戏开发快速入门教程第1章了解OUYA及其设备

    OUYA游戏开发快速入门教程第1章了解OUYA及其设备 OUYA是基于Andorid系统的游戏主机.围绕OUYA游戏机,已经形成一个完整的生态圈.在国外,OUYA已经成为知名的游戏平台.本章会站在玩家 ...

  5. BeagleBone Black快速入门教程第1章嵌入式Linux之于Maker们

    BeagleBone Black快速入门教程第1章嵌入式Linux之于Maker们 Maker的中文含义类似"创客".创客是指一群酷爱科技.热衷实践的人群,他们以分享技术.交流思想 ...

  6. ArduinoYun快速入门教程第1章ArduinoYun概览

    ArduinoYun快速入门教程第1章ArduinoYun概览 本章是全书的开篇,在本章笔者将把Arduino以及Yun的方方面面介绍给大家.其中包括Arduino这个术语的解释.Yun相对其他开发板 ...

  7. Keras functional API快速入门

    2019独角兽企业重金招聘Python工程师标准>>> Keras functional API快速入门 The Keras functional API is the way to ...

  8. php yii2 api框架,Yii2框架制作RESTful风格的API快速入门教程

    先给大家说下什么是REST restful REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Ro ...

  9. 牛客:【2021秋季算法入门班第七章习题:动态规划1】部分题解:方块与收纳盒、舔狗舔到最后一无所有、可爱の星空、[NOIP1999]拦截导弹

    题单链接:牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)  P1001 方块与收纳盒 传送门:1001-方块与收纳盒_2021秋季 ...

最新文章

  1. 学习笔记之yum的本地源配置和ATP简介和使用
  2. 【数据挖掘】数据挖掘建模 ( 预测建模 | 描述建模 | 预测模型 | 描述模型 | 判别模型 | 概率模型 | 基于回归的预测模型 )
  3. RHEL/CentOS查看网卡的MAC地址
  4. 2018第九届蓝桥杯C/C++ B国赛 —— 第三题:格雷码
  5. 数据库MySQL/mariadb知识点——操作篇(2)库管理语句
  6. WebApi接口 - 响应输出xml和json 转
  7. python实验总结心得体会_Python,Pyvisa操作Agilent 86140x系列OSA
  8. java去掉mongodb日志_MongoDB日志文件过大的解决方法 清理
  9. 怎么用计算机弹c哩c哩,计算器音乐c哩c哩乐谱 | 手游网游页游攻略大全
  10. WPF中如何选择合适的元数据标记?(英文)
  11. netdev_priv
  12. IntelliJ IDEA开发工具插件GsonFormat插件安装使用
  13. 开发一个软件需要哪些角色
  14. sheng的学习笔记-mysql框架原理
  15. 通过linux进程号(pid)查找Oracle的session中都执行那些sql
  16. P4编程环境安装(ubuntu16.04,p4c+bmv2+mininet+PI+tutorial)
  17. mysql 行转列查询优化_行转列及列转行查询
  18. 大数据技术之Hive------操作记录笔记
  19. 深入了解 Swarm:去中心化存储和通信系统
  20. 【计算机网络】Socket详解

热门文章

  1. 有了天猫精灵智能套组,享受管家级别智能服务
  2. update会锁表吗?
  3. 计算机向u盘拷贝速度慢,U盘读写拷贝速度慢的解决措施
  4. 在Firefox安装selenium
  5. sinon.js的spy、stub和mock
  6. LINUX内核内存屏障
  7. ionic自动生成icon和splash
  8. 阿里云视频点播服务SDK的使用,视频文件上传测试
  9. 编程小TIPS:使用函数式风格Either来编程
  10. ISO3834国际焊接认证简介