java--网络编程

网络编程概述

1.什么是计算机网络

把分布在不同地方的"计算机",通过通信设备与线路连接起来,实现信息,资源共享.

2.计算机网络最早出现在哪里,演变趋势是什么?

最早出现在美国军方使用,后逐渐推广至全球各地

网络模型

java语言是支持网络的, java把网络实现细节封装成不同的类,使用这些类开发的程序就可以实现网络间的数据传输.

网络编程的目的:直接或间接地通过网络协议与其它计算机进行通讯

网络编程两个核心要素:

1.如何精确找到网络中的某台主机

2.找到后如何可靠高效的进行数据传输

解决这两个要素的方法一般是:

1.通过IP(主机)找主机+端口(程序)找计算机中的程序

2.通信协议:通信双方TCPUDP进行数据传输

传输层协议中有两个非常重要的协议:

● 传输控制协议TCP(Transmission Control Protocol)

● 用户数据报协议UDP(User Datagram Protocol)。

TCP

特点

安全可靠 相对于UDP协议 传输效率低
发送数据前 先要建立连接 三次握手

三次握手:通俗理解就是客户端向服务器端发送链接请求,服务器端收到后会向客户端返回连接请求和序号无误,客户端收到反馈后会再次向服务器端反馈信息,从而建立连接

确定网络没有问题开始进行数据发送
结束时 四次挥手

**四次挥手:**客户端向服务器端发送断开请求与序号,服务器端收到后会返回确认断开连接信息以及未传输完成的数据,客户端收到后会向服务器端进行数据确认收到信息后断开

UDP

特点:

发送数据不需要建立和释放连接 速度快
但是不可靠: 将数据,源,目的 封装在一个数据报中,只管发送即可

TCP编程

网络app开发大多利用套接字Soket进行开发,并且通信的两端都要有Socket,因为Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输

Socket常用方法

  • InputStream getInputStream() throws IOException

获取与Socket相关联的字节输入流,用于从Socket中读 数据

  • OutputStream getOutputStream() throws IOException

获取与Socket相关联的字节输出流,用于向Socket中写 数据。

socket工作过程

● 创建 Socket

● 打开连接到 Socket 的输入/出流:

**使用 getInputStream()方法获得输入流,

使用 getOutputStream()方法获得输出流,进行数据传输

● 按照一定的协议对 Socket 进行读/写操作

● 关闭 Socket:

代码实现

package lesson.io3_12_18;

import com.sun.corba.se.spi.activation.Server;

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

public class netdemo {
    /*启动服务器端*/
    public static void main(String[] args) throws IOException {
        /*1.创建服务器*/
        ServerSocket serverSocket = new ServerSocket(9966);
        System.out.println("服务器启动,等待客户端连接");
        //监听客户带有无连接到服务器,裂解后返回客户端socker对象,如果一直没有客户端连接,一直阻塞等待
        Socket socket = serverSocket.accept();
        System.out.println("客户端连接成功");
        //4.在服务器端接收消息
        InputStream in = socket.getInputStream();
        byte[] b = new byte[100];
        int length = in.read(b);
        String s = new String(b, 0, length, "utf-8");
        System.out.println(s);
    }
}

package lesson.io3_12_18;

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

public class Clint {
    //启动客户端
    public static void main(String[] args) throws IOException {
        /*2.创建客户端*/
        //创建客户端Sockert,创建时三次握手,检测网络是否畅通,不畅通报错
        Socket socket = new Socket();
       /* 3.客户端向服务器端发消息*/
        //获得输出流对象,并向服务器端发送数据
        //客户端给服务器端以流的方式发消息
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write( "你好".getBytes("utf-8"));
    }
}

UDP编程

UDP不同于TCL,它通过类DatagramSocket和 DatagramPacket 实现了基于 UDP 协议网络程序。

UDP数据报通过数据报套接字 DatagramSocket 发送和接收,它只管发送不考虑是否送达,这就是为什么UDP不够安全的原因

DatagramPacket 对象封装了UDP数据报

<注释:UDP的发送与接收方不用建立联系---->

下面我们使用代码实现

package lesson.net12_21;
//服务器端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Udp1 {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(9999);
        byte[] b = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(b, b.length);
        //接受
        while (true) {
            datagramSocket.receive(datagramPacket);
            String s = new String(b, 0, datagramPacket.getLength(), "utf-8");
            System.out.println(s);
        }
    }
}

package lesson.net12_21;
//客户端
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.*;

public class udp2 {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket();
        while(true){
            //创建数据报
            byte [] b = "你好服务器".getBytes("UTF-8");
            DatagramPacket packet = new DatagramPacket(b,b.length, InetAddress.getByName("127.0.0.1"),9999);
            datagramSocket.send(packet);
        }

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值