Java教程

网络编程

本文主要是介绍网络编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

网络编程

网络的概念

网络通信

1.概念:两台设备之间通过网络实现数据传输;

2.网络通信:将数据通过网络从一台设备传输到另一台设备

3.java.net包下提供了一系列的类或接口,完成网络通信

image


网络

1.概念:两台或多台设备通过一定物理设备连接起来构成了网络;

2.根据网络的覆盖范围不同,对网络进行分类:

​ 局域网:覆盖范围最小,仅仅覆盖一个教室或一个机房;

​ 城域网:覆盖范围较大,可以覆盖一个城市;

​ 广域网:覆盖范围最大,可以覆盖全国甚至全球,万维网是广域网的代表;


网络通信协议

协议(Tcp/Ip):在网络编程中,数据的组织形式就是协议;

Tcp/Ip(Transmission Control Protocol/Internet Protocol)的简写,

中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议,Internet国际互联网络的基础,简单的说,就是由网络层的IP协议和传输层的TCP协议组成的


TCP网络通信编程

image


实例:客户端向服务发送hello,server,使用字节流

服务端:

package com.example.socket;

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

/**
 * @Author 郜庆辉
 * @Time 2022/6/10 14:57
 * @Version 1.0
 */
public class SocketTcp01Server {
    public static void main(String[] args) throws IOException {
        //1.在本机的9999端口监听,等待连接
        // 细节:要求在本机没有其他服务在监听9999
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务端在9999端口监听,等待连接...");
        //2.当没有客户端连接9999端口时,程序会阻塞,等待连接
        //如果有客户端连接,则会返回Socket对象,程序继续执行
        Socket socket = serverSocket.accept();
        System.out.println("服务端Socket返回=" + socket.getClass());
        //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示
        InputStream inputStream = socket.getInputStream();
        
        //4.IO读取
        byte[] buf = new byte[1024];
        int readLine = 0;
        
        while ((readLine = inputStream.read(buf)) != -1){
            System.out.println(new String(buf,0,readLine));//根据读取到的实际长度显示为字符串
            
        }
        //5.关闭流和socket
        serverSocket.close();
        socket.close();
        inputStream.close();
    
    }
}

客户端:

package com.example.socket;

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

/**
 * @Author 郜庆辉
 * @Time 2022/6/10 15:02
 * @Version 1.0
 */
public class SocketTcp01Client {
    public static void main(String[] args) throws IOException {
        //思路:
        //1.连接客户端(ip,端口)
        //2.解读:连接本机的9999端口,如果不是本机,可以时域名或者时ip地址
        //如果连接成功,返回一个socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(),9999);
        System.out.println("客户端Socket返回=" + socket.getClass());
        //3.通过输出流,写入数据到数据通道
        OutputStream outputStream = socket.getOutputStream();
        //解释:字符串.getBytes表示将一个字符串转成一个字节数组
        outputStream.write("hello,server".getBytes());
        
        //4.关闭流对象和socket,必须关闭
        outputStream.close();
        socket.close();
        System.out.println("客户端退出...");
    }
}

实例:客户端向服务发送hello,server,服务端向客户端发送hello,client,使用字节流

客户端:

package com.example.socket2;

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

/**
 * @Author 郜庆辉
 * @Time 2022/6/10 15:30
 * @Version 1.0
 */
public class SocketTcp02Client {
    public static void main(String[] args) throws IOException {
    
        //思路:
        //1.连接客户端(ip,端口)
        //2.解读:连接本机的8888端口,如果不是本机,可以是域名或者是ip地址
        //如果连接成功,返回一个socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
    
        //3.通过输出流,写入数据到数据通道
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello,server".getBytes());
    
        //4.添加一个结束标记,通俗来说就是已经说完话了,如果没有会双方会一直等待继续输入
        socket.shutdownOutput();
        
        //5.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示
        InputStream inputStream = socket.getInputStream();
        int readLine = 0;
        byte[] buf = new byte[1024];
        while ((readLine = inputStream.read(buf)) != -1){
            System.out.println(new String(buf,0,readLine));
        }
        
        //6.关闭流
        outputStream.close();
        inputStream.close();
        socket.close();
        
        
    }
}

服务端:

package com.example.socket2;

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

/**
 * @Author 郜庆辉
 * @Time 2022/6/10 15:30
 * @Version 1.0
 * 根据字节流实现双方通信
 */
public class SocketTcp02Server {
    public static void main(String[] args) throws IOException {
        //1.在本机的8888端口监听,等待连接
        // 细节:要求在本机没有其他服务在监听8888
        ServerSocket serverSocket = new ServerSocket(8888);
        
        //2.当没有客户端连接8888端口时,程序会阻塞,等待连接
        //如果有客户端连接,则会返回Socket对象,程序继续执行
        Socket socket = serverSocket.accept();
    
        //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示
        InputStream inputStream = socket.getInputStream();
    
        //4.IO读取
        byte[] buf = new byte[1024];
        int readLine = 0;
        while ((readLine = inputStream.read(buf)) != -1){
            System.out.println(new String(buf,0,readLine));
        }
    
        //5.通过输出流,写入数据到数据通道
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello,client".getBytes());
    
        //6.添加一个结束标记,通俗来说就是已经说完话了,如果没有会双方会一直等待继续输入
        socket.shutdownOutput();
    
        //7.关闭流和socket
        serverSocket.close();
        socket.close();
        inputStream.close();
        outputStream.close();
        
    }
}

实例:客户端向服务发送hello,server,服务端向客户端发送hello,client,使用字符流

package com.example.socket3;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Author 郜庆辉
 * @Time 2022/6/10 15:30
 * @Version 1.0
 * 根据字节流实现双方通信
 */
public class SocketTcp03Server {
    public static void main(String[] args) throws IOException {
        //1.在本机的8888端口监听,等待连接
        // 细节:要求在本机没有其他服务在监听8888
        ServerSocket serverSocket = new ServerSocket(8888);
        
        //2.当没有客户端连接8888端口时,程序会阻塞,等待连接
        //如果有客户端连接,则会返回Socket对象,程序继续执行
        Socket socket = serverSocket.accept();
    
        //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示
        InputStream inputStream = socket.getInputStream();
    
        //使用字符流来读取
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);
    
        //5.通过输出流,写入数据到数据通道
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello,client 字符流");
        bufferedWriter.newLine();//插入一个换行符,表示写入的内容结束,注意:要求对方使用readLine()来读!!
        bufferedWriter.flush();//如果使用的是字符流需要手动刷新,否则数据不会写入数据通道
    
        //6.添加一个结束标记,通俗来说就是已经说完话了,如果没有会双方会一直等待继续输入
        socket.shutdownOutput();
    
        //7.关闭流和socket
        serverSocket.close();
        socket.close();
        bufferedReader.close();
        bufferedWriter.close();
        
    }
}

UDP网络通信编程

基本介绍:

  1. 类DatagramSocket和DatagramPacket[数据包/数据报]实现了基于UDP协议网络程序
  2. UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不确定什么时候可以抵达。
  3. DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号
  4. UDP协议中每个数据报都给出了完整的地址信息,因此无须简历发送方和接收方的连接

image

实例:

UPD接收端:

package com.example.UDP;



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


/**
 * @Author 郜庆辉
 * @Time 2022/6/11 17:06
 * @Version 1.0
 * UPD接收端
 */
public class UDPReceiverA {
    public static void main(String[] args) throws IOException {
        //1.创建一个DatagramSocket对象,准备在9999端口接收数据
        DatagramSocket socket = new DatagramSocket(9999);
        //2.构建一个DatagramPacket对象,准备接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes,bytes.length);
        //3.调用接收方法,将通过网络传输的DatagramPacket对象填充到packet对象
        //注意:当有数据包发送到本机的9999端口时就会接收数据,没有数据报发送就阻塞等待
        System.out.println("接收端A等待接收数据");
        socket.receive(packet);
        //4.可以把packet进行拆包,取出数据并显示
        int length = packet.getLength();//实际收到的数据字节长度
        byte[] data = packet.getData(); //接收到的数据
        String s = new String(data, 0, length);
        System.out.println(s);
    
        //接收返回的数据好的明天见
        byte[] bytes1 = "好的明天见".getBytes();
        DatagramPacket packet1 = new DatagramPacket(bytes1,bytes1.length, InetAddress.getByName("169.254.115.195"),9998);
        socket.send(packet1);
        
        socket.close();
    }
}

UPD发送端:

package com.example.UDP;

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

/**
 * @Author 郜庆辉
 * @Time 2022/6/11 17:05
 * @Version 1.0
 * UPD发送端
 */
public class UDPsenderB {
    public static void main(String[] args) throws IOException {
        //1.创建一个DatagramSocket对象,准备在9998端口接接收
        DatagramSocket socket = new DatagramSocket(9998);
        
        //2.将需要发送的数据封装到DatagramPacket对象
        byte[] data = "明天吃火锅".getBytes();
        
        //说明:封装的DatagramPacket对象  data 内容字节数组,data.length  主机IP,端口
        DatagramPacket packet = new DatagramPacket(data,data.length, InetAddress.getByName("169.254.115.195"),9999);
        
        socket.send(packet);
    
        data = new byte[1024];
        DatagramPacket packet1 = new DatagramPacket(data,data.length);
        System.out.println("发送端B等待接收数据");
        socket.receive(packet1);
        
        int length = packet1.getLength();//实际收到的数据字节长度
        data = packet1.getData(); //接收到的数据
        String s = new String(data, 0, length);
        System.out.println(s);
        //关闭资源
        socket.close();
    }
   
}
这篇关于网络编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!