前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于TCP的网络数据传输测试(使用腾讯云)

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

作者头像
张风捷特烈
发布2018-10-11 15:39:42
2.3K0
发布2018-10-11 15:39:42
举报
文章被收录于专栏:Android知识点总结
零、前言:

在腾讯云上开启服务,然后本地计算机去连接,以此测试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输出

代码语言:javascript
复制
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.运行服务端
代码语言:javascript
复制
编译
javac TransServer.java -encoding utf-8
运行:此时会进入等待
java TransServer
3.客户端的实现

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

代码语言:javascript
复制
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.服务器端
代码语言:javascript
复制
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.运行服务端
代码语言:javascript
复制
编译
javac UpLoadFileServer.java -encoding utf-8
运行:此时会进入等待
java UpLoadFileServer
3.客户端:
代码语言:javascript
复制
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.考虑并发:

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

代码语言:javascript
复制
/**
 * 作者:张风捷特烈
 * 时间: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----看到这里,我在此感谢你的喜欢与支持

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.10.08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 零、前言:
    • 实现场景1
      • 实现场景2:
      • 一、实现场景1
        • 1、服务端实现:
          • 2.运行服务端
            • 3.客户端的实现
            • 二、文件上传
              • 1.服务器端
                • 2.运行服务端
                  • 3.客户端:
                    • 4.考虑并发:
                    • 后记:捷文规范
                      • 1.本文成长记录及勘误表
                        • 2.更多关于我
                          • 3.声明
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档