蒋振飞的博客 - Java入门15:网络编程   
正在加载蒋振飞的博客...
V3.0
蒋振飞的博客

Java入门15:网络编程

发布时间: 2018年10月17日 发布人: 蒋振飞 热度: 318 ℃ 评论数: 0

一、UDP协议

    1.DatagramPacket

        ①DatagramPacket类,该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据。
        ②接收端的构造方法只需要接收一个字节数组来存放接收到的数据,而发送端的构造方法不但要接收存放了发送数据的字节数组,还需要指定发送端IP地址和端口号。

    2.DatagramPacket构造方法

        1) DatagramPacket(byte[] buf, int length) 

            构造 DatagramPacket,用来接收长度为 length 的数据包。

        2) DatagramPacket(byte[] buf, int length, InetAddress address, int port) 

            构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

    3.DatagramPacket常用方法

        1) InetAddress getAddress() 

            返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 

        2) byte[] getData() 

            返回数据缓冲区。 

        3) int getLength() 

            返回将要发送或接收到的数据的长度。 

        4) int getPort() 

            返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。

    4.DatagramSocket

        DatagramPacket数据包的作用就如同是“集装箱”,DatagramSocket类的作用就类似于码头,使用这个类的实例对象就可以发送和接收DatagramPacket数据包。

    5.DatagramSocket构造方法

        1) DatagramSocket() 

            构造数据报套接字并将其绑定到本地主机上任何可用的端口。

        2) DatagramSocket(int port) 

            创建数据报套接字并将其绑定到本地主机上的指定端口。

    6.DatagramSocket常用方法

        1) void send(DatagramPacket p) 

            从此套接字发送数据报包 。

        2) void receive(DatagramPacket p) 

            从此套接字接收数据报包。 

    7.UDP发送

        ①创建发送端Socket对象
        ②创建数据并打包
        ③发送数据
        ④释放资源

package day13;
 
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

 /*
 * DatagramSocket() :创建Socket对象并随机分配端口号
 * DatagramSocket(int port) :创建Socket对象并指定端口号
 */
 
public class SendDemo {
    public static void main(String[] args) throws IOException  {
        // 创建发送端Socket对象
        DatagramSocket ds = new DatagramSocket();
        // 创建数据并打包
        /*
         * DatagramPacket :此类表示数据报包
         * 数据 byte[]
         * 设备的地址 ip
         * 进程的地址  端口号
           DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
         */
       
        String s = "hello udp,im comming!";
        byte[] bys = s.getBytes();
        int length = bys.length;
        InetAddress address = InetAddress.getByName("baidu");//发送给当前设备
        int port = 8888;
        // 打包
        DatagramPacket dp = new DatagramPacket(bys,length,address,port);
        // 发送数据
        ds.send(dp);
        // 释放资源
        ds.close();
    }
}

    8.UDP接收

        ①创建接收端Socket对象
        ②接收数据
        ③解析数据
        ④输出数据
        ⑤释放资源

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

public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        // 创建接收端Socket对象
        DatagramSocket ds = new DatagramSocket(8888);
        //接收数据
        // DatagramPacket(byte[] buf, int length) 
        byte[] bys = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bys,bys.length);
               
        System.out.println(1);
        ds.receive(dp);// 阻塞
        System.out.println(2);
       
        // 解析数据
        // InetAddress getAddress() : 获取发送端的IP对象
        InetAddress address = dp.getAddress();
        // byte[] getData()  :获取接收到的数据,也可以直接使用创建包对象时的数组
        byte[] data = dp.getData();
        // int getLength()  :获取具体收到数据的长度
        int length = dp.getLength();
       

        // 输出数据
        System.out.println("sender ---> " + address.getHostAddress());
        // System.out.println(new String(data,0,length));
        System.out.println(new String(bys,0,length));
        // 释放资源
        ds.close();
 
    }
}

二、TCP协议

    1.UDP与TCP的相同点    

        TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象。

    2.UDP与TCP的区别

        ①UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据。
        ②而TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接。

    3.ServerSocket

        在开发TCP程序时,首先需要创建服务器端程序。JDK的java.net包中提供了一个ServerSocket类,该类的实例对象可以实现一个服务器段的程序。

    4.ServerSocket构造方法

        ①ServerSocket(int port) 

            创建绑定到特定端口的服务器套接字。

    5.ServerSocket的常用方法

        1) Socket accept() 

            侦听并接受到此套接字的连接。 

        2) InetAddress getInetAddress() 

            返回此服务器套接字的本地地址。 

    6.Socket

        ServerSocket对象可以实现服务端程序Socket类用于实现TCP客户端程序。

    7.Socket构造方法

        1) Socket(InetAddress address, int port) 

            创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

        2) Socket(String host, int port) 

            创建一个流套接字并将其连接到指定主机上的指定端口号。

    8.Socket常用方法

        1) int getPort()

            该方法返回一个int类型对象,该对象是Socket对象与服务器端连接的端口号。

        2) netAddress getLocalAddress()

            该方法用于获取Socket对象绑定的本地IP地址,并将IP地址封装成InetAddress类型的对象返回。

        3) void close()

            该方法用于关闭Socket连接,结束本次通信。在关闭socket之前,应将与socket相关的所有的输入/输出流全部关闭,这是因为一个良好的程序应该在执行完毕时释放所有的资源。

        4) InputStream getInputStream()

            该方法返回一个InputStream类型的输入流对象,如果该对象是由服务器端的Socket返回,就用于读取客户端发送的数据,反之,用于读取服务器端发送的数据。

        5) OutputStream getOutputStream()

            该方法返回一个OutputStream类型的输出流对象,如果该对象是由服务器端的Socket返回,就用于向客户端发送数据,反之,用于向服务器端发送数据。        

    9.TCP发送

        ①创建发送端Socket对象(创建连接)。
        ②获取输出流对象。
        ③发送数据。
        ④释放资源。

package day13;
 
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
 

public class ClientDemo {
    public static void main(String[] args) throws IOException {
        // 创建发送端Socket对象(创建连接)
        Socket s = new Socket(InetAddress.getByName("itheima"),10086);
        // 获取输出流对象
        OutputStream os = s.getOutputStream();
        // 发送数据
        String str = "hello tcp,im comming!!!";
        os.write(str.getBytes());
        // 释放资源
        // os.close();
        s.close();
    }
}

    10.TCP接收

        ①创建接收端Socket对象
        ②监听(阻塞)
        ③获取输入流对象
        ④获取数据
        ⑤输出数据
        ⑥释放资源

package day13;
 
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
 

public class ServerDemo {
    public static void main(String[] args) throws IOException  {
        // 创建接收端Socket对象
        ServerSocket ss = new ServerSocket(10086);
        // 监听(阻塞)
        Socket s = ss.accept();
        // 获取输入流对象
        InputStream is = s.getInputStream();
        // 获取数据
        byte[] bys = new byte[1024];
        int len;//用于存储读到的字节个数
        len = is.read(bys);
        // 输出数据
        InetAddress address = s.getInetAddress();
        System.out.println("client ---> " + address.getHostName());
        System.out.println(new String(bys,0,len));
        // 释放资源
        s.close();
        // ss.close();
    }
}

    11.模拟用户登录

package day13;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
 

public class ClientTest {
    public static void main(String[] args) throws  IOException  {
        // 创建客户端Socket对象
        // Socket s = new Socket(InetAddress.getByName("itheima"),8888);
        Socket s = new Socket("itheima",8888);
       
        // 获取用户名和密码
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入用户名:");
        String username = br.readLine();
        System.out.println("请输入密码:");
        String password = br.readLine();
       
       
        // 获取输出流对象
        // BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        PrintWriter out = new PrintWriter(s.getOutputStream(),true);
        // 写出数据
        out.println(username);
        out.println(password);
       
        // 获取输入流对象
        BufferedReader serverBr = new BufferedReader(new InputStreamReader(s.getInputStream()));
        // 获取服务器返回的数据
        String result = serverBr.readLine();
        System.out.println(result);
        // 释放资源
        s.close();
    }
}
package day13;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
 
public class ServerTest {
    public static void main(String[] args) throws IOException {
        // 创建服务器端Socket对象
        ServerSocket ss = new ServerSocket(8888);
        // 监听
        Socket s = ss.accept();
        // 获取输入流对象
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        // 获取用户名和密码
        String username = br.readLine();
        String password = br.readLine();
        // 判断用户名和密码是否正确
        boolean flag = false;
        if("itheima".equals(username) && "123456".equals(password)) {
            flag = true;
        }
        // 获取输出流对象
        PrintWriter out = new PrintWriter(s.getOutputStream(),true);
       
        // 返回判断信息
        if(flag) {
            out.println("登陆成功");
        }
        else {
            out.println("登陆失败");
        }
        // 释放资源
        s.close();
        // ss.close();// 服务器一般不关闭
    }
}

打赏 蒋振飞

取消

感谢您的支持,我会继续努力的!

扫码支持
一分也是爱     一块不嫌多

点击 支付宝 或 微信 打赏蒋振飞

打开支付宝扫一扫,即可进行扫码打赏哦

评论列表