Java基础-网络编程-TCP

4 篇文章 0 订阅

1.6、TCP

传输中添加通道的原理:

在这里插入图片描述

从一端来的输入,可能无法被另外一边的理解,添加了这个通道,就相当于进行了一次翻译,让两边都能理解。

1、文字传输

客户端

1.连接服务器—>Socket

2.发送消息

3.代码:

package com.edwin.lesson2;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
 * @author EdwinD
 * @create 2020.08.20 下午 05:07
 * @desc 客户端1
 **/
public class TcpClient1 {
    public static void main(String[] args) {
        Socket socket = null;
        OutputStream os = null;

        try {
    //        1.需要知道服务器的地址
            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
    //        2.设置连接端口号
            int port = 7777;
    //        3.创建一个socket,进行连接。Socket是有参数的,默认无参数
            socket = new Socket(serverIP, port);
    //        4.发送消息:IO流
            os = socket.getOutputStream();
            os.write("Welcome,EdwinD is Learning Web".getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

服务器

1.建立服务的端口—>ServerSocket

2.等待用户的连接—>Accept

3.代码:

package com.edwin.lesson2;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * @author EdwinD
 * @create 2020.08.20 下午 05:08
 * @desc 服务端1
 **/
public class TcpServer1 {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        try {
    //    提供服务器的地址:serverSocket,套接字。
    //        1.我有一个地址
            serverSocket = new ServerSocket(7777);
            while (true) {
                //        2.等待客户链接过来,这里的socket等同于TcpClient1里面的socket,
                socket = serverSocket.accept();
                //        3.读取客户端
                is = socket.getInputStream();
            /*
                byte[] buffer = new byte[1024];
                int len;
                while((len = is.read(buffer))! = -1){
                    String msg = new String(buffer,0,len);
                    System.out.println(msg);
                }
            */
                baos = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int len;
                while ((len = is.read(buffer)) != -1) {
                    baos.write(buffer, 0, len);
                }
                System.out.println(baos.toString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
//            关闭资源
            if (baos != null) {
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (serverSocket != null) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

输出:

在这里插入图片描述

2、文件上传

同样分为客户端和服务端。

客户:

package com.edwin.lesson2;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
/**
 * @author EdwinD
 * @create 2020.08.20 下午 06:06
 * @desc 客户端2
 **/
public class TcpClient2 {
    public static void main(String[] args) throws IOException {
//        1.创建一个Socket连接
//        注意port不可以和Client1的重合,否则会报错。
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 7788);
//        2.创建一个输出流
        OutputStream os = socket.getOutputStream();
//        3.文件流
        FileInputStream fils = new FileInputStream(new File("Study.jpg"));
//        4.写出文件
        byte[] buffer = new byte[1024];
        int len;
        while ((len = fils.read(buffer)) != -1) {
            os.write(buffer, 0, len);
        }

//        通知服务器,已经结束了
        socket.shutdownInput();

//        确定接受完毕,才能断开连接
        InputStream inputStream = socket.getInputStream();

//        接受的是String类型的数组,
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        byte[] buffer2 = new byte[1024];
        int len2;
        while ((len2 = inputStream.read(buffer2)) != -1) {
            baos.write(buffer2, 0, len2);
        }
        System.out.println(baos.toString());

//        5.关闭资源
        baos.close();
        inputStream.close();
        fils.close();
        os.close();
        socket.close();
    }
}

服务:

package com.edwin.lesson2;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * @author EdwinD
 * @create 2020.08.20 下午 06:14
 * @desc 服务端2
 **/
public class TcpServer2 {
    public static void main(String[] args) throws IOException {
//        1.创建服务
        ServerSocket serverSocket = new ServerSocket(7788);
//        2.监听客户端的连接
        Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端连接,一旦链接,就失败了。
//        3.得到输入流
        InputStream is = socket.getInputStream();
//        4.文件输出
        FileOutputStream receive = new FileOutputStream(new File("receive.jpg"));
        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer)) != -1) {
            receive.write(buffer, 0, len);
        }

//        通知客户端,接收完成
        OutputStream os = socket.getOutputStream();
        os.write("接受完毕,可以断开。".getBytes());

//        5.关闭资源
        receive.close();
        is.close();
        socket.close();
        serverSocket.close();
    }
}

输出:

在这里插入图片描述
路漫漫其修远兮,吾将上下而求索。

参考文献

《【狂神说Java】网络编程实战讲解》
视频链接

2020.08.24

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值