IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 2021-10-11 -> 正文阅读

[网络协议]2021-10-11

网络编程 – TCP通信程序练习 --多线程实现文件上传服务器

TCP通信基础概念:

TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信的两端形成虚拟链路,一旦建立了虚拟的网络连接,两端的程序就可以通过虚拟的链路进行通信!java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表两端的接口,并通过Socket产生Io流来进行网络通信,Java为客户端提供了Scoket类,为服务器端提供了ServerSocket类!

客户端的代码如下:

public class ClientDemo {
    public static void main(String[] args) throws IOException {

        Socket s = new Socket("192.168.121.5",10086);

        BufferedReader br = new BufferedReader(new FileReader("test"));

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

        String Line;
        while ((Line=br.readLine())!=null){
            bw.write(Line);
            bw.newLine();
            bw.flush();
        }
        s.shutdownOutput();
        BufferedReader brClient = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line;
        while ((line=brClient.readLine())!=null){
            System.out.println("服务器反馈数据:"+line);
        }
        s.close();
        br.close();

    }
}

客户端代码解读

第一步:创建Socket对象,指定服务器的IP地址,以及服务应用程序的端口号;
第二步:创建缓冲字符输入流,指定要上传的文件;
第三步:用Socket对象去获取输出流,将客户端要上传的文件发送到服务器;
最后再用Socket对象去获取输入流,获取服务器反馈的信息,输出在控制台;

服务器端代码如下:

public class ServerDemo {
    public static void main(String[] args) throws IOException {

        ServerSocket ss =new ServerSocket(10086);


  while (true){
        Socket s = ss.accept();
        new Thread(new ServerThread(s)).start();
      }
  }
}

服务器端代码解读

第一步:创建ServerSocket对象,指定发送请求的服务应用程序端口;
因为服务器不知道客户端什么时候发来请求,所以要永远处于开启状态,等待请求服务,
所以用while(true){}死循环代码来实现!

每个客服端发送请求,服务器都要为他们开启一个线程,并且把他们上传的文件保存在不同的位置!

代码实现如下:

public class ServerThread implements Runnable {
    private Socket s;
    public ServerThread(Socket s) {
        this.s=s;
    }
    @Override
    public void run() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            //BufferedWriter bw = new BufferedWriter(new FileWriter("copy"));
            int count = 0;
            File file = new File("copy["+count+"].java");
            while (file.exists()){
                count++;
                file = new File("copy["+count+"].java");
            }
            BufferedWriter bw  =new BufferedWriter(new FileWriter(file));
            String Line;
            while ((Line=br.readLine())!=null){
                bw.write(Line);
                bw.newLine();
                bw.flush();
            }
            BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            bwServer.write("文件上传成功!");
            bwServer.newLine();
            bwServer.flush();
            bwServer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

run()方法中的代码解读
第一步:用ServerSocket对象获取输入流,将客户端传送过来的文件复制到指定的文件,
因为有很多的客服端会发来请求,要保证每次客户端传送过来的文件可以保存在不同的文件,
所以用

 int count = 0;
            File file = new File("copy["+count+"].java");
            while (file.exists()){
                count++;
                file = new File("copy["+count+"].java");
            }
            BufferedWriter bw  =new BufferedWriter(new FileWriter(file));

这段代码实现这个需求,这里需要明白的是 我们创建字符流对象时,可以传递File类做参数,指定路径!

第二步:当服务器接受到客户端传送过来的文件并上传到指定的位置时,就会反馈信息给客户端:

 BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            bwServer.write("文件上传成功!");
            bwServer.newLine();
            bwServer.flush();
            bwServer.close();

最后释放资源就行!

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-13 11:46:20  更:2021-10-13 11:47:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:55:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码