Java Socket

TCP/IP协议

TCP/IP

  • TCP/IP是以TCP和IP为基础不同层次上的多个协议的集合。
  • TCP/IP参考模型
    这里写图片描述
    • 应用层:应用程序通过这一层访问网络,常见 FTP、HTTP、DNS 和 TELNET 协议;
    • 传输层:TCP协议以及UDP协议
    • 网络层:IP 协议,ARP、RARP 协议,ICMP 协议等;
    • 网络接口层:是TCP/IP的基层,负责数据帧的发送和接收。
  • 运作关系
    这里写图片描述

TCP

  • Transmission Control Protocol 传输控制协议

IP

  • 互联网协议
IP地址
  • 通常是32bit数字组成,以小数点隔开,用十进制表示,如”255.255.255.255”
域名
  • IP地址的别名
MAC地址
  • MAC地址:又称物理地址、硬件地址。用来确定互联网中硬件的位置。
  • TCP/IP协议中的网络层管理IP地址,链路层(网络接口层)用来管理MAC地址。
    • 每个网络位置有自己的IP地址
    • 每个主机有自己的MAC地址
端口号
  • IP地址相当于网络位置,找到位置要进行通信需要知道端口号。IP地址好比是紫禁城,端口就相当于是各个城门,不同的城门由于不同的用处。
  • 一个IP地址有2^16个端口号,各自有相应的功能,其中(0~1023)是系统预留,由Internet端口分配机构管理,常见常用端口号如下(1~1023):
    • SMTP(简单邮件传输协议)服务器的 TCP 端口号都是 25
    • FTP(文件传输协议)服务器的 TCP 端口号都是 21
    • TFTP(简单文件传输协议)服务器的 UDP 端口号都是 69
  • 其他端口号是用于各种不同的应用进行通信使用的。
封装与分用
  • 数据通过协议层每一层会对数据的首部或尾部添加信息。
    这里写图片描述

InetAddress 类

  • INetAddress类用于标示网络上的硬件资源,标示互联网协议地址
        InetAddress address1 =  InetAddress.getLocalHost();
        //通过相应的方法获取相应信息
        System.out.println("计算机名:"+address1.getHostName());
        System.out.println("计算机IP:"+address1.getHostAddress());
        byte [] IP = address1.getAddress();
        System.out.println("字符数组型IP"+Arrays.toString(IP));



        //获取其他机器信息的实例
      InetAddress address2 = InetAddress.getByName("Eric.local");//通过计算机名获取实例
      InetAddress address3 = InetAddress.getByName("192.168.1.100");//通过IP地址获得实例
      System.out.println(address2.getHostName());

URL 应用

  • 统一资源定位符,表示网络上某一资源的地址。
  • URL常用方法

常用方法

        // URL 常用方法
        URL imooc = new URL("http://www.imooc.com");
        // 通过重构方法依据上一个URL创建新的URL
        URL url1 = new URL(imooc, "/index.html?username = tom #test");
        // ?后面是参数 #后面是锚点
        System.out.println("协议是:" + url1.getProtocol());
        System.out.println("主机:" + url1.getHost());
        System.out.println("端口:" + url1.getPort());// 未指定端口返回-1
        System.out.println("文件名:" + url1.getFile());
        System.out.println("文件路径" + url1.getPath());
        System.out.println("涉及:" + url1.getRef());
        System.out.println("查询字符串:" + url1.getQuery());

获取网页信息

        // 使用URL类读取网页内容
        URL url = new URL("http://www.baidu.com");
        // 通过openStream 方法获得网站信息字节流
        InputStream in = url.openStream();
        // 将字节流转换成字符流
        InputStreamReader isr = new InputStreamReader(in, "utf-8");
        // 增加缓冲提高效率
        BufferedReader br = new BufferedReader(isr);
        // 通过缓冲读取一行数据
        String data = br.readLine();
        // 通过循环将所有信息读完
        while (data != null) {
            System.out.println(data);
            data = br.readLine();
        }
        br.close();
        isr.close();
        in.close();
    }

socket 实现TCP编程

  • 失误间隔时间太长,将上此错误遗留,复习时改正:

资源路径

UDP 编程

package socket;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
//服务器端用于处理客户登录
class UDPServer {
    public static void main(String[] args) throws IOException {
        // 1.创建DatagramSocket对象并制定端口
        DatagramSocket socket = new DatagramSocket(8801);
        // 2.创建数据报用于接受客户端发送过来的信息
        byte[] data = new byte[1024];
        DatagramPacket packet = new DatagramPacket(data, data.length);// 将得到的数据存到数组中
        // 3.接受客户端发送的数据
        System.out.println("服务器端已经启动,等待接受数据");
        socket.receive(packet);// 未接受到之前是阻塞的
        // 4.读取数据
        String info = new String(data, 0, packet.getLength());
        System.out.println(info);
 /**
  * 向客户端响应数据
  */
        //1.通过packet获取客户端的地址以及端口号
        InetAddress address = packet.getAddress();//获取客户端的地址
        int port  = packet.getPort();//获取客户端的端口
        byte[] message = "服务器接收到你的消息了".getBytes();
        //2.创建数据报
        DatagramPacket packet1 = new DatagramPacket(message , message.length, address, port);
        //3.发送数据报
        socket.send(packet1);
        //4.关闭资源
        socket.close();
    }
}
package socket;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Arrays;

//客户端
public class UDPClient {
    public static void main(String[] args) throws IOException {
        /**
         * 向服务器发送数据
         */
        //1.定义服务器地址、端口号、数据
        InetAddress address = InetAddress.getByName("localhost");
        int port = 8801;
        byte [] data  = "用户名:admin 密码:1234".getBytes();
        //2.依据要发送的数据创建数据报
        DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
        //3.创建DatagramSocket对象
        DatagramSocket socket = new DatagramSocket();
        //4.发送数据
        socket.send(packet);

        /**
         * 接受服务器返回的数据
         */
        //1.创建用于接受数据的字节数组
        byte[] message = new byte[1024];
        //2.创建数据包来接受信息
        DatagramPacket packet1 = new DatagramPacket(message, message.length);
        //3.接收信息
        socket.receive(packet1);
        //4.显示接受到的数据
        String info = new String(message, 0, packet1.getLength());
        System.out.println(info);
    }
}

综合项目

  • 在学完JBDC后进行项目练习
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值