Java学习之路---高级编程(网络通讯TCP,UDP学习)

网络通讯

网络编程三要素:

在这里插入图片描述

IP

ip地址的概述:

ip地址相当于双方的地址,收,寄时都需要一个地址。

ip地址由四个8位二进制数组成
在这里插入图片描述

在这里插入图片描述

查看ip

在本机可直接使用命令行窗口,输入下列命令:
在这里插入图片描述
java获取ip地址和主机名称:

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * 查看ip地址
 */
public class ip1 {
    public static void main(String[] args) throws UnknownHostException {
        //确定主机名可以是IP地址或者主机名称
        InetAddress address = InetAddress.getByName("主机名");

        String name = address.getHostName();

        String ip = address.getHostAddress();
        System.out.println("主机名" + "\t" + name);
        System.out.println("ip" + "\t" + ip);

    }
}

网络通讯协议:

在这里插入图片描述

端口:

在这里插入图片描述

协议:

UDP:

在这里插入图片描述

TCP:

在这里插入图片描述

三次握手图示:
在这里插入图片描述

UDP

在这里插入图片描述

udp传输数据的步骤:

发送端:
在这里插入图片描述

import java.io.IOException;
import java.net.*;

public class UDPsenddemo {
    public static void main(String[] args) throws IOException {
        //创建DatagramSocket对象
        DatagramSocket ds = new DatagramSocket();

        //创建数据,并打包数据
        //DatagramPacket(byte buf[]//数据打包,int length//数据长度,InetAddress ip  ip地址,int port端口号)
        byte b[] = "helloword".getBytes();
//        int l=b.length;
//        InetAddress ip = InetAddress.getByName("10.82.68.16");
//        int port=10086;
//        DatagramPacket dp=new DatagramPacket(b,l,ip,port);
        DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress.getByName("10.82.68.16"), 10086);

        //发送数据
        ds.send(dp);
        //关闭发送端口
        ds.close();
    }
}

接收端:
在这里插入图片描述

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UDPresivedemo {
    public static void main(String[] args) throws IOException {
        //创建Socket接收端口接收数据
        // DatagramSocket(int inport)
        DatagramSocket ds = new DatagramSocket(10086);

        //创建接收包用于存储接收到的数据
        //构造DatagramPackage(byte[] b,int length)方法接收数据
        byte b[] = new byte[1024];
        DatagramPacket dp = new DatagramPacket(b, b.length);

        //调用resive方法接收数据
        ds.receive(dp);

//        //解析数据并在控制台显示
//        //byte getData()用于返回数据缓冲区
//        byte datas[] = dp.getData();
//        //只接收输入过来的长度
//        int len = dp.getLength();
//        String dataString = new String(datas, 0, len);
//        System.out.println("接收到的数据是:" + dataString);
        System.out.println("接收到的数据是:" + new String(dp.getData(), 0, dp.getLength()));


        //关闭端口
        ds.close();
    }
}

TCP

TCP传输数据的步骤:

发送端:
在这里插入图片描述

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class TCPsend {
    public static void main(String[] args) throws IOException {
        //创建客户端对象
        Socket s = new Socket("10.82.39.240", 18888);
        //获取输出流写数据
        OutputStream os = s.getOutputStream();
        os.write("helloworld".getBytes());
        s.close();
    }
}

接收端:
在这里插入图片描述

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPresive {
    public static void main(String[] args) throws IOException {
        //创建端口
        ServerSocket ss = new ServerSocket(9999);
        //第三次握手确认端口
        Socket s = ss.accept();
        InputStream is = s.getInputStream();
        byte b[] = new byte[1024];
        int len = is.read(b);
        String data = new String(b, 0, len);
        System.out.println("接收到的数据是:" + data);

        ss.close();
    }
    

练习:

在这里插入图片描述
发送端:

package com.IP.TCPandThread;

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

public class TCPsend {
    public static void main(String[] args) throws IOException {
        Socket s=new Socket("192.168.21.1",18888);
        BufferedReader br=new BufferedReader(new FileReader("javatest\\name.txt"));
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

        String line;
        while ((line=br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        //自定义终止反馈
//        bw.write("886");
//        bw.newLine();
//        bw.flush();
        //给出反馈。停止这次写入
        s.shutdownOutput();
        /**
         * 等待服务器给出反馈
         */
        BufferedReader bwserver=new BufferedReader(new InputStreamReader(s.getInputStream()));
        String s1 = bwserver.readLine();
        System.out.println("服务器给出的反馈为:"+s1);

        bwserver.close();
        bw.close();
        br.close();
        s.close();
    }
}

客户端:

package com.IP.TCPandThread;

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

public class TCPserver {
    public static void main(String[] args) throws IOException {
        ServerSocket ss=new ServerSocket(18888);
        Socket s = ss.accept();
        BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
        BufferedWriter bw=new BufferedWriter(new FileWriter("copyName.txt"));
        String line;
        while ((line=br.readLine())!=null){
//            自定义读数据结束的标志
//            if ("886".equals(line))
//                break;
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        /**
         * 服务器给出反馈
         */
        BufferedWriter bwserver=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bwserver.write("文件已接收");
        bw.newLine();
        bw.flush();

        bwserver.close();
        bw.close();
        br.close();
        s.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛总来学习了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值