java中基于TCP和UDP协议的类介绍及使用

235 阅读2分钟

TCP 协议

特点:应⽤程序在使⽤ TCP 协议前必须先建⽴连接,才能传 输数据,数据传输完毕需要释放连接。

例如打电话:先拨通,再说话,挂电话。

TCP 协议如果没有成功建⽴连接,就⼀直处于阻塞状态,需 要持续等待。

TCP 的优点是⾮常可靠,数据不会丢失,并且数据是按照先 后顺序依次到达。缺点就是速度慢、效率低。

⾦融系统,对安全性要求较⾼的系统必须使⽤ TCP。

Java 是如何完成基于 TCP 协议的⽹络开发?

Socket 编程,Java 是通过 Socket 完成 TCP 程序开发。

java.net.Socket 可以在客户端和服务端之间建⽴起可靠的连 接。

java.net.Socket 表示客户端,java.net.ServerSocket 表示服 务器。


开发思路

在服务端创建 ServerSocket 对象,通过该对象的 accpet() ⽅ 法可以接收到若⼲个表示客户端的 Socket 对象。

Server

package com.southwind.tcp;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream inputStream = null;
        OutputStream outputStream = null;
        DataInputStream dataInputStream = null;
        DataOutputStream dataOutputStream = null;

        //IP:本机IP,端口:8080
        try {
            serverSocket = new ServerSocket(8080);
            System.out.println("------服务端------");
            System.out.println("已启动,等待接收客户端请求...");
            while(true){
                socket = serverSocket.accept();
                //通过输入流获取数据
                inputStream = socket.getInputStream();
                dataInputStream = new DataInputStream(inputStream);
                String request = dataInputStream.readUTF();
                System.out.println("接收到了客户端请求:"+request);
                //给客户端作出响应
                outputStream = socket.getOutputStream();
                dataOutputStream = new DataOutputStream(outputStream);
                String response = "你也好!";
                dataOutputStream.writeUTF(response);
                System.out.println("给客户端作出的响应:"+response);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                dataOutputStream.close();
                dataInputStream.close();
                inputStream.close();
                outputStream.close();
                socket.close();
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Client

package com.southwind.tcp;

import java.io.*;
import java.net.Socket;

public class Client {
    public static void main(String[] args) {
        Socket socket = null;
        InputStream inputStream = null;
        DataInputStream dataInputStream = null;
        OutputStream outputStream = null;
        DataOutputStream dataOutputStream = null;
        try {
            //访问服务器 IP+端口
            socket = new Socket("127.0.0.1",8080);
            System.out.println("------客户端------");
            String request = "你好!";
            System.out.println("客户端说:"+request);
            outputStream = socket.getOutputStream();
            dataOutputStream = new DataOutputStream(outputStream);
            dataOutputStream.writeUTF(request);
            //接收服务器的响应
            inputStream = socket.getInputStream();
            dataInputStream = new DataInputStream(inputStream);
            String response = dataInputStream.readUTF();
            System.out.println("服务器响应:"+response);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                dataOutputStream.close();
                dataInputStream.close();
                outputStream.close();
                inputStream.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}


UDP 协议

TCP 协议适⽤于安全性要求较⾼,不追求速度的系统,⾦融 系统。

UDP 协议适⽤于流畅性要求较⾼,不追求安全的系统,视频 聊天、语⾳聊天、直播。

UDP 所有连接都是不可靠的,不需要建⽴连接,直接发送数 据即可。


Java 如何开发基于 UDP 协议的应⽤

DatagramSocket、DatagramPacket

package com.southwind.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketAddress;

public class TerminalA {
    public static void main(String[] args) throws Exception {
        //接收数据
        byte[] buff = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(buff,buff.length);
        DatagramSocket datagramSocket = new DatagramSocket(8181);
        datagramSocket.receive(datagramPacket);
        String mess = new String(datagramPacket.getData(),0,datagramPacket.getLength());
        System.out.println("我是 TerminalA,接收到了"+datagramPacket.getAddress()+":"+datagramPacket.getPort()+"传来的数据:"+mess);

        //发送数据
        String reply = "我是TerminalA,已接收到你发来的信息!";
        SocketAddress socketAddress = datagramPacket.getSocketAddress();
        DatagramPacket datagramPacket2 = new DatagramPacket(reply.getBytes(),reply.getBytes().length,socketAddress);
        datagramSocket.send(datagramPacket2);
    }
}

package com.southwind.udp;

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

public class TerminalB {
    public static void main(String[] args) throws Exception {
        //发送数据
        String mess = "我是TerminalB,你好!";
        InetAddress inetAddress = InetAddress.getByName("localhost");
        DatagramPacket datagramPacket = new DatagramPacket(mess.getBytes(),mess.getBytes().length,inetAddress,8181);
        DatagramSocket datagramSocket = new DatagramSocket(8080);
        datagramSocket.send(datagramPacket);

        //接收数据
        byte[] buff = new byte[1024];
        DatagramPacket datagramPacket2 = new DatagramPacket(buff,buff.length);
        datagramSocket.receive(datagramPacket2);
        String reply = new String(datagramPacket2.getData(),0,datagramPacket2.getLength());
        System.out.println("我是 TerminalB,接收到了"+datagramPacket2.getAddress()+":"+datagramPacket2.getPort()+"返回的数据:"+reply);
    }
}