Java-网络编程

一.概述

网络编程:就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换

二.网络编程三要素

A:IP地址:InetAddress: 网络中设备的标识,不易记忆,可用主机名
B:端口号: 用于标识进程的逻辑地址,不同进程的标识
C:传输协议: 通讯的规则常见协议:TCP,UDP

(一).IP相关操作

dos命令获取主机名称: hostname
在这里插入图片描述

InetAddress类(为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress 供我们使用)

InetAddress类的常见功能

	public static InetAddress getByName(String host)在给定主机名的情况下获取InetAddress的实例
	public static InetAddress getLocalHost()获取本机IP的InetAddress实例
	public String getHostAddress()//获取IP
	public String getHostName()//获取主机名

在这里插入图片描述

(二)端口

物理端口 网卡口
逻辑端口 我们指的就是逻辑端口
a:每个网络程序都会有一个逻辑端口
b:用于标识进程的逻辑地址,不同进程的标识
c:有效端口:0-65535(两个字节),其中0-1024系统使用或保留端口。我们在编程中尽量不要使用这些端口

(三)协议

UDP

		将数据源和目的封装成数据包中,不需要建立连接;
		每个数据报的大小在限制在64k;
		因无连接,是不可靠协议;
		不需要建立连接,速度快

TCP

		建立连接,形成传输数据的通道;
		在连接中进行大数据量传输;
		需要连接所以是可靠协议;
		必须建立连接,效率会稍低

三.基于UDP的发送和接收数据

(一)发送数据(客户端)

步骤:a: 创建UDP通讯客户端对象(DatagramSocket)
b: 创建数据报包 public DatagramPacket(byte[] buf, int length, InetAddress address,int port)
c: 发送 数据
d: 释放资源

(二)接收数据(客户端)

a: 创建UDP通讯协议服务器端对象(DatagramSocket) 注意要用有参数构造 指定端口号
b: 创建数据报包,作用用来接收数据 // public DatagramPacket(byte[] buf, int length)
c: 接收数据 receive(dp) ;
d: 解析数据报包,拿出数据 dp.getData() ; dp.getLength() ;
e: 释放资源

案例

在这里插入图片描述
在这里插入图片描述

四.基于TCP的发送和接收数据

(一)发送数据(客户端)

步骤:a: 创建TCP通讯协议客户端对象(Socket) // public Socket(String host, int port)
b: 获取输出流对象
c: 写数据
d: 释放资源

(二)接收数据(服务端)

步骤:a: 创建TCP通讯协议服务器端对象(ServerSocket)
b: 监听客户端
c: 获取输入流对象
d: 读取数据
e: 释放资源

案例

public class client {
public static void main(String[] args) throws IOException {
    Socket socket = new Socket ( "192.168.1.204", 3654 );
    Scanner sc = new Scanner ( System.in );
    OutputStream out = socket.getOutputStream ( );
    InputStream in = socket.getInputStream ( );
    while (true){
        System.out.print("请输入你要发送的消息:" );
        String next = sc.next ( );
        if (next.equals ( "结束传输" )){
            out.write ( next.getBytes ());
            out.flush ();
            byte[] bytes = new byte[1024 * 8];
            in.read ( bytes );
            String s = new String ( bytes );
            System.out.println (s );
            break;
        }else {
            out.write ( next.getBytes ());
            out.flush ();
            byte[] bytes = new byte[1024 * 8];
            in.read ( bytes );
            String s = new String ( bytes );
            System.out.println (s );
        }
    }
    socket.close ();
    sc.close ();
    out.close ();
}

}
在这里插入图片描述

public class server {
public static void main(String[] args) throws IOException {
    ServerSocket Socket = new ServerSocket ( 3654 );
    System.out.println ("服务端已经开启,等待接收!" );
    java.net.Socket socket = Socket.accept ( );
    InputStream in = socket.getInputStream ( );
    OutputStream out = socket.getOutputStream ( );
    while (true){
        byte[] bytes = new byte[1024 * 8];
        in.read ( bytes );
        String s = new String ( bytes ).trim ( );
        if (s.equals ( "结束传输" )){
            out.write ( "已经结束了传输".getBytes () );
            break;
        }else {
            System.out.println (s );
            out.write ( "服务端已经收到".getBytes () );
        }
    }
    socket.close ();
    Socket.close ();
    in.close ();
    out.close ();
}

}
在这里插入图片描述

如何实现多个客户端连接一个服务端

在服务端有如下代码,来一个客户端连接一个客户端在这里插入图片描述

五.URL客户端

(一)概述

URL 统一资源定位符
http://ip地址:端口/资源地址
127.0.0.1 <==> localhost

(二)步骤

创建 new URL(“http://ip地址:端口/资源地址”)//在连接一个网页时,构造参数传入一个网址字符串就行
HTTPURLConnection conn = url.openConnection(); // 建立连接, 发送get请求
conn.getInputStream(); // 拿到服务器返回的结果
默认发送这两个请求// GET /index.html HTTP/1.1; // Host: localhost;
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/PreyHard/article/details/84781800