29 java网络编程

本文介绍了TCP和UDP两种网络协议,TCP具有三次握手确保安全但速度较慢,适合大量数据传输;UDP速度快但可能丢失数据,适合小数据交换。通过Java编程展示了TCP的ServerSocket和Socket类使用,以及UDP的DatagramSocket和DatagramPacket类的应用。
摘要由CSDN通过智能技术生成

在这里插入图片描述


📖博主介绍


个人主页: Zinksl
编程社区: Zinksl编程酒馆
个人格言: 想法落实的最佳时机就是现在!🏄

如果你 喜欢交流热爱分享欢迎加入编程社区交流群 大家一起学习技术,交流心得,共同进步🚅


1 🚩TCP协议,三次握手,安全但是比较慢,适合传送大量数据

1.1 🏔️TCP编程用到的类

(1)InetAddress类

InetAddress类带有很多方法,主要的方法作一个讲解:

方法说明
getLocalHost获取本机InetAddress对象
getByName根据指定主机名/域名获取ip地址对象
getHostName获取InetAddress对象的主机名
getHostAddress获取InetAddress对象地址

(2)Socket(插座)

使用步骤

服务端:
①创建 ServerSocket对象,指定端口
②ServersSocket的accept方法会返回一个Socket对象;【在服务器端获得插座】
③Socket对象提供了getOutputStream()方法和getInputStream()方法会返回字符流
客户端:
①创建Socket对象,指定服务器ip地址和端口
②通过Socket提供的方法,获得IO流进行相关操作
【注意: 发送完一次数据需要用,Socket提供的shutdownOutput()方法告诉对象已经发送完毕,最后要关闭Socket和IO流】

🌰server端代码示例:

public class serverDemo {
    public static void main(String[] args) throws IOException {
//        创建ServerSocket对象
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务器端口9999等待连接。。。");
//        获取Socket对象
        Socket socket = serverSocket.accept();
        InputStream inputStream  = socket.getInputStream();
        byte [] buffer = new byte[1024];
        int leng = 0;
        while ((leng = inputStream.read(buffer)) != -1){
            System.out.print(new String(buffer,0,leng));
        }
        System.out.println();
        //        回应数据
        OutputStream outputStream = socket.getOutputStream();
        byte  [] bufferser = "你好client".getBytes();
        outputStream.write(bufferser);
        socket.shutdownOutput();
        System.out.println("server回应完毕");
        socket.close();
        inputStream.close();
        outputStream.close();
    }

}

🌰client端代码示例:

public class ClientDemo {
    public static void main(String[] args) throws IOException {
//        创建Socket对象,连接服务器
        Socket socket = new Socket("127.0.0.1",9999);
        OutputStream outputStream = socket.getOutputStream();
        byte  [] buffer = "你好server".getBytes();
//        发送数据
        outputStream.write(buffer);
//        告诉对方发送完毕,否则会阻塞
        socket.shutdownOutput();
        System.out.println("client 第一次发送完毕");
//        获取回应
        InputStream inputStream  = socket.getInputStream();
        byte [] bufferclient = new byte[1024];
        int leng = 0;
        while ((leng = inputStream.read(bufferclient)) != -1){
            System.out.print(new String(bufferclient,0,leng));
        }
        System.out.println();
        socket.close();
        inputStream.close();
        outputStream.close();
        System.out.println("收到!退出");
    }
}

2 🚩UDP协议,可能数据丢失,适合小数据

🏔️DatagramSocket类和DatagramPacket类实现了UDP协议;

UDP编程没有明确的服务端和客户端;

🌰send端代码示例

public class SendDemo {
    public static void main(String[] args) throws IOException {
//        创建DatagramSocket对象,用于接收发送,端口9988用于接收
        DatagramSocket datagramSocket = new DatagramSocket(9988);
        byte [] sendBuffer = new byte[1024];
        sendBuffer = "四大名著是啥1?".getBytes();
//        打包数据
        DatagramPacket sendpacket = new DatagramPacket(sendBuffer, sendBuffer.length, InetAddress.getByName("127.0.0.1"), 9999);
        datagramSocket.send(sendpacket);
        System.out.println("提问完毕!");
//        接收回答
        byte [] daan = new byte[1024];
        DatagramPacket danpacket = new DatagramPacket(daan, daan.length);
        datagramSocket.receive(danpacket);
//        拆包
        int daleng = danpacket.getLength();
        byte [] danfu = danpacket.getData();
        System.out.println("回答:"+new String(danfu,0,daleng));
        datagramSocket.close();
        System.out.println("send端对话结束");
    }
}

🌰receive端代码示例:

public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
//        创建DatagramSocket对象,用于发送接受,9999端口等待接收
        DatagramSocket datagramSocket = new DatagramSocket(9999);
//        接收数据
        byte [] reciveBuffer = new byte[1024];
        DatagramPacket recdatagramPacket = new DatagramPacket(reciveBuffer,reciveBuffer.length);
        datagramSocket.receive(recdatagramPacket);
//        拆包
        int leng = recdatagramPacket.getLength();
        byte huixin [] = recdatagramPacket.getData();
        String str = new String(huixin,0,leng);
        if ("四大名著是啥?".equals(str)){
            byte h1 [] = "三国、水浒、红楼、西游".getBytes();
            DatagramPacket packet = new DatagramPacket(h1, h1.length, InetAddress.getByName("127.0.0.1"), 9988);
            datagramSocket.send(packet);
        }else {
            byte h1 [] = "what?".getBytes();
            DatagramPacket packet = new DatagramPacket(h1, h1.length, InetAddress.getByName("127.0.0.1"), 9988);
            datagramSocket.send(packet);
        }
        datagramSocket.close();
        System.out.println("receive端结束对话!");
    }
}

结尾彩蛋

认真分享技术,记录学习点滴若内容对你有用可以鼓励一下🍻方式如下
点赞:👍 留言:✍收藏:⭐️

如有疑问欢迎评论区留言,或加入技术交流群:1002743802
关注我订阅专栏,会持续体系化更新哦👈

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zinksl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值