网络编程

网络编程

计算机网络

将不同地理位置的计算机,通过网线,使多台计算机通过软件可以共享数据

java提供的网络类库,将实现细节隐藏起来

网络的通讯要素

IP/端口号:精确找到计算机某台主机

网络通信协议:快速传输数据

IP地址:InetAddress

唯一的标识 Internet 上的计算机

本地回环地址(hostAddress):127.0.0.1

主机名(hostName):localhost

端口号

不同的进程有不同的端口号

被规定为一个 16 0~65535

InetAddress类

Internet上的主机有两种方式表示地址:

域名(hostName):www.baidu.com

IP 地址(hostAddress):220.181.111.37

方法:

InetAddress.getByName("www.baidu.com");

getHostAddress();

getHostName();

 public static void main(String[] args) throws UnknownHostException {
        InetAddress inetAddress = InetAddress.getByName("www.baidu.com");
        System.out.println(inetAddress);
        System.out.println(inetAddress.getHostAddress());//主机地址
        System.out.println(inetAddress.getHostName());//主机名
    }

网络通信协议

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

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

传输控制协议TCP

使用前,需建立TCP连接,形成数据传输通道

可靠的数据传输方式

传输前"三次握手",断开时"四次挥手"

断开时比较烦杂,速度慢
在这里插入图片描述

用户数据报协议UDP

使用时,不需要提前建立连接

不可靠

每个数据报的大小限制在64K

结束时无需释放资源,速度快

Socket套接字

创建服务器端

 //创建服务器
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("等待连接");
        //服务器监听等待链接的客户端请求连接
        Socket socket = serverSocket.accept();//阻塞式 监听
        System.out.println("连接成功");

创建客户端

  //创建客户端,创建时需要建立连接
        Socket socket = new Socket("127.0.0.1", 8888);

如何接收和发送消息

服务器端

public static void main(String[] args) throws IOException {
        //创建服务器
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("等待连接");
        //服务器监听等待链接的客户端请求连接
        Socket socket = serverSocket.accept();//阻塞式 监听
        System.out.println("连接成功");

        //接收客户端的信息
        InputStream in = socket.getInputStream();
        byte[] b = new byte[1024];
        int length = in.read(b);//将客户端的信息写入byte数组中

        //转字符串
        String s = new String(b, 0, length, "utf-8");
        System.out.println("来自客户端的信息:" + s);

        //服务器端向客户端发送消息
        OutputStream out = socket.getOutputStream();
        out.write("我已收到".getBytes("utf-8"));
    }

客户端

public static void main(String[] args) throws IOException {
        //创建客户端,创建时需要建立连接
        Socket socket = new Socket("127.0.0.1", 8888);

        //获得输出流对象
        OutputStream out = socket.getOutputStream();
        System.out.println("向服务器发送的内容:");
        Scanner input = new Scanner(System.in);
        String s = input.next();
        out.write(s.getBytes("utf-8"));

        //客户端收到服务器端的消息
        InputStream in = socket.getInputStream();
        byte [] b= new byte[1024];
        int length = in.read(b);
        String ms = new String(b,0,length,"utf-8");
        System.out.println("接收到服务器端的信息:"+ms);

        out.close();
        socket.close();
    }

另外一种接收和发送的方法

DataInputStream&&DataOutputStream

        /*接收***发过来的信息*/ 
        DataInputStream dataInputStream = new DataInputStream(sss.getInputStream());
        String ms = dataInputStream.readUTF();
        System.out.println(ms);

        /*向***发送信息*/
        DataOutputStream dataOutputStream = new DataOutputStream(sss.getOutputStream());
        String s = input.next();
        dataOutputStream.writeUTF(s);

UDP网络通信

类 DatagramSocket 和 DatagramPacket 实现了基于UDP 协议网络程序。

UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。

客户端
public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket();
    
        //封装数据包/报
        Scanner input = new Scanner(System.in);
        String str = input.next();
        byte[] b = str.getBytes("utf-8");
        InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
        DatagramPacket datagramPacket = new DatagramPacket(b,0,b.length,inetAddress,9999);
  //发送数据send();
  datagramSocket.send(datagramPacket);

    }
服务器端
 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);
        datagramSocket.receive(datagramPacket);//接收数据
        //datagramPacket.getLength()实际向数组中装入的长度
        String s = new String(datagramPacket.getData(),0,datagramPacket.getLength());
        System.out.println(s);
    }
posted @ 2021-12-02 15:55  肖帆咪  阅读(39)  评论(0编辑  收藏  举报