Java笔记 - 网络编程

计算机网络

网络编程三要素

  1. IP地址 - 设备的标识
  2. 端口 - 标识设备中的应用程序
  3. 协议 - 对数据的传输格式、速率做统一规定

IP地址

Java提供了一个 InetAddress 类供我们使用

方法说明
getByName获取主机的ip地址
getHostName获取此ip地址的主机名
getHostAddress返回文本显示中的ip地址字符串

此处存疑

public class IPdemo1 {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress address = InetAddress.getByName("mac");
        String hostName = address.getHostName();
        String hostAddress = address.getHostAddress();

        System.out.println(hostName);
        System.out.println(hostAddress);
    }
}

UDP

UDP是一种不可靠的交付

UDP发送数据

步骤
  1. 创建发送端的Socket对象

  2. 创建数据,并打包

  3. 调用DatagramSocket 对象的方法发送数据

  4. 关闭发送端

  5. public class DsDemo {
        public static void main(String[] args) throws IOException {
            //1.创建一个udp对象
            DatagramSocket ds = new DatagramSocket();
            //2.创建数据
            byte[] bytes = "helloworld".getBytes();
            int len = bytes.length;
            InetAddress address = InetAddress.getByName("192.168.0.102");
            int post = 10086;
            DatagramPacket dp = new DatagramPacket(bytes, len, address, post);
            //3.发送数据
            ds.send(dp);
            //4.关闭发送端
            ds.close();
        }
    }
    

UDP接收数据

  1. 创建接收端的Socket对象

  2. 创建一个数据包,用来接收数据

  3. 调用DatagramSocket对象的方法接收数据

  4. 解析数据包,并把数据输出在控制台

  5. public class ReceiveDemo {
        public static void main(String[] args) throws IOException {
    
            //1.创建一个udp对象
            DatagramSocket ds = new DatagramSocket(10086);
            //2.创建数据包
            byte[] bytes = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
            //3.解析数据包
            ds.receive(dp);
            byte[] newBytes = dp.getData();
            String s = new String(newBytes,0,dp.getLength());
            System.out.println(s);
            //4.关闭
            ds.close();
        }
    }
    

使用键盘录入

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

TCP

TCP发送数据

  1. 创建客户端的Socket对象

    此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

    Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

  2. 获取输出流,写数据

    OutputStream os = s.getOutputStream();

  3. 释放资源

    和UDP相比少了创建packet的步骤

TCP接收数据

  1. 创建服务器端的Socket对象
  2. 获取输入流,读数据
  3. 释放资源

SOCKET

套接字使用TCP提供了两台计算机之间的通信机制。

客户端程序创建一个套接字,并尝试连接服务器的套接字。

当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。

java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。

以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:

  • 服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
  • 服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
  • 服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。
  • Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
  • 在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。

连接建立后,通过使用 I/O 流在进行通信,每一个socket都有一个输出流和一个输入流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。

练习

实现从客户端读取文件,在服务器保存该文件

public class ClientDemo {
    public static void main(String[] args) throws IOException {

        Socket s = new Socket("192.168.0.102", 10086);
        BufferedReader br = new BufferedReader(new FileReader("day08/java.txt"));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String line;
        while ((line = br.readLine()) != null) {
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        br.close();
        s.close();
    }
}
public class ServerDemo {
    public static void main(String[] args) throws IOException {

        ServerSocket ss = new ServerSocket(10086);
        //监听客户端连接
        Socket s = ss.accept();

        InputStream is = s.getInputStream();  //字节流
        BufferedReader br = new BufferedReader(new InputStreamReader(is));  //字节转字符流,并且包装成高级Buffer流
        BufferedWriter bw = new BufferedWriter(new FileWriter("day08/copy.txt"));
        
        String line;
        while((line = br.readLine())!=null){
          //System.out.println(line);
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        bw.close();
        s.close();
        ss.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值