专栏首页Android知识点总结基于TCP的网络数据传输测试(使用腾讯云)

基于TCP的网络数据传输测试(使用腾讯云)

零、前言:

在腾讯云上开启服务,然后本地计算机去连接,以此测试TCP连接 这是java服务器端最底层的原理 实现场景1:客户端(本机)输入一个字符串,服务端返回相应的大写字母 实现场景2:一个客户端(本机)上传文件到服务器,然后通过浏览器访问 实现场景3:多个客户端(本机)同时上传文件到服务器(并发)

1.在服务器上有java环境 2.服务器上开放了测试使用的接口:本测试为:8080端口 3.如果没有服务器,开两个cmd,本地也可以测试

实现场景1

tcp连接.png

实现场景2:

上传图片.png


一、实现场景1

1、服务端实现:

获取socket-->通过socket获取读流I--> 通过socket获取写流O-->I读取后转为大写O输出

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

/**
 * 作者:张风捷特烈
 * 时间:2018/10/8 0008:10:19
 * 邮箱:1981462002@qq.com
 */
public class TransServer {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(8080);
            Socket socket = serverSocket.accept();
            String ip = socket.getInetAddress().getHostAddress();
            System.out.println(ip + "....connected");
            //读取socket读取流中的数据。
            BufferedReader brIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //目的。socket输出流。将大写数据写入到socket输出流,并发送给客户端。
            PrintWriter pwOut = new PrintWriter(socket.getOutputStream(), true);
            String line = null;
            while ((line = brIn.readLine()) != null) {
                pwOut.println(line.toUpperCase());
                System.out.println(line.toUpperCase());
            }
            serverSocket.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
2.运行服务端
编译
javac TransServer.java -encoding utf-8
运行:此时会进入等待
java TransServer
3.客户端的实现

建立服务-->获取键盘录入--> 将数据发给服务端--> 获取服务端返回的大写数据--> 结束,关资源-->

public class TransClient {
    public static void main(String[] args) {
        String ip = "193.112.165.148";
        int port = 8080;
        try {
            Socket socket = new Socket(ip, port);
            //定义读取键盘数据的流对象。
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            //定义目的,将数据写入到socket输出流。发给服务端。
            PrintWriter pwOut = new PrintWriter(socket.getOutputStream(), true);
            //定义一个socket读取流,读取服务端返回的大写信息。
            BufferedReader brIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line = null;
            while ((line = br.readLine()) != null) {
                if ("over".equals(line)) {
                    break;
                }
                pwOut.println(line);
                System.out.println("服务端:" + brIn.readLine());
            }
            br.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

tcp连接.png

二、文件上传

1.服务器端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 作者:张风捷特烈
 * 时间:2018/10/8 0008:11:50
 * 邮箱:1981462002@qq.com
 * 说明:服务器端
 */
public class UpLoadFileServer {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(8080);

            while (true) {
                Socket socket = serverSocket.accept();
                String ip = socket.getInetAddress().getHostAddress();
                System.out.println(ip + "....connected");

                InputStream is = socket.getInputStream();
                String fileName = "F:\\ds.jpg";
                FileOutputStream fos = new FileOutputStream(fileName);
                int len = 0;
                byte[] buf = new byte[1024];
                while ((len = is.read(buf)) != -1) {
                    fos.write(buf, 0, len);
                }

                OutputStream os = socket.getOutputStream();
                os.write("OK".getBytes());
                fos.close();
                socket.close();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取范围随机整数:如 rangeInt(1,9)
     *
     * @param s 前数(包括)
     * @param e 后数(包括)
     * @return 范围随机整数
     */
    public static int rangeInt(int s, int e) {
        int max = Math.max(s, e);
        int min = Math.min(s, e) - 1;
        return (int) (min + Math.ceil(Math.random() * (max - min)));
    }
}
2.运行服务端
编译
javac UpLoadFileServer.java -encoding utf-8
运行:此时会进入等待
java UpLoadFileServer
3.客户端:
public class UpLoadFileClient {
    public static void main(String[] args) {
        String ip = "193.112.165.148";
        int port = 8080;
        try {
            Socket socket = new Socket(ip, port);
            String path = "C:\\Users\\Administrator\\Desktop\\数据结构.jpg";
            FileInputStream fis = new FileInputStream(path);
            OutputStream os = socket.getOutputStream();
            byte[] buf = new byte[1024];
            int len = 0;
            while ((len = fis.read(buf)) != -1) {
                os.write(buf, 0, len);
            }
            //告诉服务端数据已写完
            socket.shutdownOutput();

            InputStream is = socket.getInputStream();
            byte[] bufIn = new byte[1024];
            int num = is.read(bufIn);
            System.out.println(new String(bufIn, 0, num));
            fis.close();
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上传图片.png

访问:http://www.toly1994.com:8080/imgs/ds.jpg

结果.png


4.考虑并发:

按照上面的代码,每次只能有一个人上传,后者等待,显然是不合理的,应该多个人可以并发执行。 这里使用多线程,每次用户连接都开启一个线程来执行带代码。

/**
 * 作者:张风捷特烈
 * 时间:2018/10/8 0008:11:50
 * 邮箱:1981462002@qq.com
 * 说明:并发上传
 */
public class UpLoadFileServerCur {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(8080);
            while (true) {
                new Thread(new FileThread(serverSocket.accept())).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class FileThread implements Runnable {
    private Socket mSocket;
    public FileThread(Socket socket) {
        mSocket = socket;
    }
    @Override
    public void run() {
        String ip = mSocket.getInetAddress().getHostAddress();
        System.out.println(ip + "....connected");
        try {
            InputStream is = mSocket.getInputStream();
            String fileName = "F:\\ip" + ip + "-" + rangeInt(3000, 10000) + ".jpg";
            FileOutputStream fos = new FileOutputStream(fileName);
            int len = 0;
            byte[] buf = new byte[1024];
            while ((len = is.read(buf)) != -1) {
                fos.write(buf, 0, len);
            }

            OutputStream os = mSocket.getOutputStream();
            os.write("上传成功".getBytes());

            fos.close();
            mSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取范围随机整数:如 rangeInt(1,9)
     *
     * @param s 前数(包括)
     * @param e 后数(包括)
     * @return 范围随机整数
     */
    public static int rangeInt(int s, int e) {
        int max = Math.max(s, e);
        int min = Math.min(s, e) - 1;
        return (int) (min + Math.ceil(Math.random() * (max - min)));
    }
}

后记:捷文规范

1.本文成长记录及勘误表

项目源码

日期

备注

V0.1--无

2018-10-2

基于TCP的网络数据传输测试(使用腾讯云)

V0.2--无

-

-

2.更多关于我

笔名

QQ

微信

爱好

张风捷特烈

1981462002

zdl1994328

语言

我的github

我的简书

我的CSDN

个人网站

3.声明

1----本文由张风捷特烈原创,转载请注明 2----欢迎广大编程爱好者共同交流 3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正

4----看到这里,我在此感谢你的喜欢与支持

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 恒大入主法拉第,FF91真的要来了吗?

    自恒大入主法拉第之后,FF91落地的步伐似乎开始逐步加快。在许家印到法拉第公司考察之后,FF91在落地到中国的步伐更加快速。就在上周,恒大法拉第未来智能汽车集团...

    孟永辉
  • BAT、TMD加持新技术背景下,互联网家装如何蝶变新生?

    几乎所有的“互联网+”模式都存在同样的问题,那就是对于行业内在运行逻辑改造的无力与浅层。互联网家装同样如此。我们看到,尽管互联网家装改变了人们获取用户的方式和手...

    孟永辉
  • 马云退休,一个全新的互联网时代或将开始

    今天,马云退休的消息无疑是一个焦点。对于马云退休的原因,外界依然有很多的猜测。几乎可以确定的是,未来马云将会从事自己心仪的教育事业,并将会持续发挥自己在教育事业...

    孟永辉
  • 饿了么并入口碑,一场“非典型”新零售大战的开始

    如果你了解互联网巨头的套路,你就会发现他们会不断用资本的力量去拓展自己的势力范围,并且建构一个能够将人们所有的生活场景全部都囊括其中的生态体系。饿了么并入口碑仅...

    孟永辉
  • 任性的苹果,任性的库克

    或许在人类历史上还没有哪一个科技公司会像苹果般任性,任性到可以不顾及用户的感受。随着苹果发布会的新鲜“上线”,我们再次见识到了苹果的任性。价格再度刷新史上最高、...

    孟永辉
  • 拼多多、趣头条上市,反驳消费升级的无效样本

    最近,有关消费升级与消费降级的讨论一直都没有停止过。作为一个新的风口和方向,人们对于消费升级和消费降级的谈论无可厚非,因为只有深入讨论才能找到合适的发展方向。但...

    孟永辉
  • 1万步21天钉钉运动大神赛

      目前所在的企业,从入职开始到现在,内部沟通协作的主要软件也就是钉钉。三月初的时候,偶然在钉钉运动一栏中发现了这个活动,当时也没怎么犹豫,果断支付了2元契约金...

    happyJared
  • 或许,9月12日的苹果新品发布会依然会让人失望!

    正如每一次的苹果邀请函都带给我们不一样的感受一样,今年9月12日的苹果发布会的邀请函依然让我们浮想联翩。这或许是苹果以往营销套路的延续——通过给人一个极具想象力...

    孟永辉
  • 共享单车落幕:上海凤凰诉ofo或在情理之中

    共享单车浩浩荡荡的发展历程伴随着资本的退却而最终落幕。尽管共享单车市场上摩拜投身美团总算是有了一个好归宿,哈罗单车对于三四线的深度布局实现了逆袭,ofo依然在仗...

    孟永辉
  • 锤子手机推“无限屏”新机:让我们为老罗的创新点赞

    人们对于锤子手机的发布会的期待其实更多的是在看罗永浩的“单口相声”。无论锤子手机如何,观众依然能够在锤子手机发布会上过一回嘴瘾。罗永浩对于自己,对于友商,对于行...

    孟永辉

扫码关注云+社区

领取腾讯云代金券