JAVA学习历程记录(十)——计算机网络

JAVA学习历程记录(十)

网络编程

网络概念

网络通信协议:连接和通信的规则,对数据的传输格式/传输速率/传输步骤做了统一的规定,通信双方必须同时遵守
目前应用最广泛的是TCP/IP协议,该协议层次结构如下:

TCP/IP协议层次
应用层(主要负责应用程序的协议,例如HTTP协议等)
如HTTP、FTP、DNS
传输层(主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议)
如TCP、UDP
网络层(是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络)
如IP、ICMP、IGMP
链路层(定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动)
如驱动程序、接口

IP地址和端口号

IPv4:由4个字节大小的二进制数来表示IP地址
IPv6:由16个字节表示IP地址
端口号:区分不同的不同的应用程序,取值范围是0~65535
DNS解析服务器:将域名和IP地址进行转换
套接字Socket:通过网络进行数据传输的机制,本质上就是一套基于网络的流

UDP协议

概述

是无连接通信协议,UDP在传输时,发送端不会确认接收端是否存在,接收端收到数据时,也不会向发送端反馈是否收到数据
通常用于音频视频和普通数据的传输
在传输数据时要求对数据进行分包,每个包大小不能超过64k大小

练习
双人聊天室

package chat;

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

public class Recive implements Runnable {
    private DatagramPacket dp;
    private DatagramSocket ds;
    @Override
    public void run() {
        try {
            ds = new DatagramSocket(8888);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        dp = new DatagramPacket(new byte[1024], 1024);
        while (true) {
                try {
                    ds.receive(dp);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                System.out.println(dp.getAddress().getHostAddress()+ ":" + new String(dp.getData(),0, dp.getLength()));


        }
    }
}
package chat;

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

public class Send implements Runnable {

    @Override
    public void run() {
        DatagramSocket ds = null;
        try {
            ds = new DatagramSocket();
        } catch (SocketException e) {
            e.printStackTrace();
        }
        Scanner sc = new Scanner(System.in);
        while (true) {

                String list = sc.next();
                byte[] by = list.getBytes();
                DatagramPacket dp = null;
                try {
                    dp = new DatagramPacket(by, by.length, InetAddress.getByName("192.168.1.148"), 8090);
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }
                try {
                    ds.send(dp);
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }
    }
package chat;

import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        new Thread(new Send()).start();
        new Thread(new Recive()).start();
    }
}

TCP协议

TCP协议时面向连接的通信协议,它提供了两台计算机之间可靠无差别的数据传输,每次连接的创建都需要经过“三次握手”
第一次握手:客户端向服务器端发出连接请求,等待服务器确认
第二次握手:服务器端向客户端回送一个响应,通知客户端收到了连接请求
第三次握手:客户端再次向服务器端发送确认信息,确认连接
传输时不限制大小

TCP通信

联系
传输文件

package copy1;

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

public class User {
    public static void main(String[] args) throws IOException {
        Socket s = new Socket("localhost",4645);
        OutputStream os = s.getOutputStream();
        File file = new File("");
        byte[] fname = file.getName().getBytes();
        os.write(fname.length);
        os.write(fname);
        FileInputStream fis = new FileInputStream(file);
        byte[] bys = new byte[1024];
        int len;
        while ((len = fis.read(bys)) != -1){
            os.write(bys,0,len);
        }
        s.shutdownOutput();
        fis.close();
        s.close();
    }
}
package copy1;

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

public class Service {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket();
        Socket s = ss.accept();
        InputStream is = s.getInputStream();
        byte i = (byte) is.read();
        byte[] filename = new byte[i];
        is.read(filename);
        FileOutputStream fos = new FileOutputStream("E:\\" + new String(filename));
        byte[] bys = new byte[1024];
        int len;
        while ((len = is.read(bys)) != -1){
            fos.write(bys,0,bys.length);
        }
        s.shutdownOutput();
        fos.close();
        ss.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值