首页 > 编程语言 >JAVA网络编程【基于TCP和UDP协议】超详细!!!

JAVA网络编程【基于TCP和UDP协议】超详细!!!

时间:2024-09-21 16:19:35浏览次数:10  
标签:DatagramSocket UDP DatagramPacket JAVA TCP InetAddress new 客户端 out

ip地址:唯一标识主机的地址

端口号:用于标识计算机上某个特定的网络程序

InetAddress类

方法说明
InetAddress InetAddress.getLocalHost()静态方法,获取本机InetAddress对象(主机名+ip地址)
InetAddress InetAddress.getByName("主机名")根据主机名或者域名获取ip地址对象(主机名+ip地址)/(域名+ip地址)
getHostName获取InetAddress对象的主机名
getHostAddress获取InetAddress对象的地址

InetSocketAddress抽象基类,子类SocketAddress

构造方法

 public SocketAddress(InetAddress inetAddress,int port){...}  //InetAddress对象+端口号

客户端(socket)

 
Socket socket = new Socket(String host,int port);   //IP,端口号
 OutputStream out = socket.getOutputStream();
 out.write("hello,Server");
 out.close();
 socket.close();

方法

 OutputStream getOutputStream()      //获取字节输出流对象
 IntputStream getInputStream()        //获取字节输入流对象

服务器端(SereverSocket)

 SereverSocket serever = new SereverSocket(int port);   //端口号  要求这个端口号没被占用,否则报异常
 Socket server = serever.accept();   //等待接收客户端的Socket通信连接,连接成功返回Socket对象与客户端建立端到端通信,当没                                      //有客户端连接这个端口会阻塞
 InputStream in = server.getInputStream();
 int i = 0;
 while((i = in.read())!=-1){
     System.out.print((char)i);
 }
 in.close();
 server.close();

如果要连续通话,在发送完一个数据的时候应该有个结束标记(没结束标记的话客户端或者服务端不知道什么时候发送结束,就会一直等待)

 socket.shutDownOutout();    //写信息结束
 socket.shutDownInput();     //读信息结束

UDP

  • 没有明确的服务端和客户端,演变成数据的发送端和接收端

  • 接收数据和发送数据通过DatagramSocket对象完成

  • 将数据封装到DatagramPacket对象/装包

  • 当接收到DatagramPacket对象,需要进行拆包,取出数据

  • DatagramSocket可以指定在哪个端口接收数据

无连接、面向数据报的特征,即每次都是没有建立连接,一次发送全部数据报一次接受全部数据报。

基于DatagramSocket类来创建数据报套接字,并使用DatagramPacket描述一个发送或接收数据报。(DatagramSocket类描述一个socket对象,本质是一个文件描述符,表示网卡设备的文件,通过读写socket文件的方式操作网卡

客户A(服务器端)

 import java.io.IOException;
 import java.net.*;
 ​
 public class Server {
 ​
     public void getServer() throws IOException {
 ​
         InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",1111);
         DatagramSocket datagramSocket = new DatagramSocket(1111);
         byte[] bytes = new byte[1024];
         DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
         datagramSocket.receive(datagramPacket);
         String message = new String(datagramPacket.getData(),0,datagramPacket.getLength());
         System.out.println("接收到客户端发送信息:"+message);
         System.out.println("正在向客户端发送信息。。。。。。。。。");
         String response = "我是服务器端,能收到";
         //获取数据包中的ip地址
         InetAddress address = datagramPacket.getAddress();
         //获取数据包中的端口号
         int port = datagramPacket.getPort();
         DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,address,port);
         datagramSocket.send(responsePacket);
         System.out.println("发送成功!!!!!");
         datagramSocket.close();
 ​
     }
 ​
     public static void main(String[] args) throws IOException {
         Server server = new Server();
         server.getServer();
     }
 ​
 }
 ​

客户B(客户端)

 import java.io.IOException;
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 import java.net.InetSocketAddress;
 ​
 public class Client {
 ​
     public void getClient() throws IOException {
         InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",1111);
         DatagramSocket datagramSocket = new DatagramSocket();
         System.out.println("发送信息。。。。。。。。。。。");
         String message = "我是客户端,能收到吗";
         DatagramPacket datagramPacket = new DatagramPacket(message.getBytes(),0,message.getBytes().length,inetSocketAddress);
         datagramSocket.send(datagramPacket);
         System.out.println("发送成功!!");
 ​
         byte[] bytes = new byte[1024];
         DatagramPacket responsePacket = new DatagramPacket(bytes,0,bytes.length);
         datagramSocket.receive(responsePacket);
         String response = new String(responsePacket.getData(),0,responsePacket.getLength());
         System.out.println("服务器发送信息"+response);
 ​
         datagramSocket.close();
     }
 ​
     public static void main(String[] args) throws IOException {
         Client client = new Client();
         client.getClient();
     }
 }
 ​

标签:DatagramSocket,UDP,DatagramPacket,JAVA,TCP,InetAddress,new,客户端,out
From: https://blog.csdn.net/sksnbdkdisbsnskd/article/details/142354892

相关文章

  • Java高级06,线程
    多线程进程:1.进程是系统运行程序的基本单位。2.每一个进程都有自己独立的一块内存空间、一组系统资源。3.每一个进程的内部数据和状态都是完全独立的。线程:线程是进程中执行运算的最小单位,可完成一个独立的顺序控制流程。多线程:一个进程中同时运行多个线程来完成不同......
  • TestNG 与 JUnit:哪种 Java 测试框架适合您?
    测试框架是确保软件质量的重要工具,在Java生态系统中,TestNG和JUnit是最流行的两个选项。虽然这两个框架都有一个共同的目标——让测试变得更容易——但它们提供了不同的特性和功能来满足不同的测试需求。在这篇博文中,我们将深入探讨TestNG与JUnit之间的详细比较,帮助您确定......
  • DOM【JavaScript】
    在JavaScript中,DOM(DocumentObjectModel:文档对象模型)是web页面的编程接口,用于表示和操作HTML和XML文档。它将文档结构化为一个树形结构,允许开发者通过JavaScript访问和修改网页的内容、结构和样式。以下是一些关于DOM的关键概念:1.结构DOM树结构是以节点为单位组......
  • 2025基于springboot的网上村委会业务办理系统-JAVA.VUE【源码、论文、开题、实训报告
       博主介绍:......
  • 2025基于springboot的自习室管理和预约系统-JAVA.VUE【源码、论文、开题、实训报告】
       博主介绍:......
  • Java毕设常见创新点汇总
    嗨嗨!这里是泡芙,又是新学期开学,部分学校的毕设也是提上日程了,这段时间不少同学在咨询我的过程中,都无外乎表达了这么几点:1、担心自己的项目太过简单过不了期中检查。2、导师提出了必须要加入创新点等要求,为此焦头烂额。3、自己的题目太大众化,不知道怎么避免查重过高。首先,项......
  • java计算机毕业设计教材征订管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景:随着教育事业的蓬勃发展,高校教材管理面临着前所未有的挑战。传统的手工教材征订方式不仅效率低下,且易出错,难以满足日益增长的师生需求及教学管理的精......
  • java计算机毕业设计明德小学教师档案管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着教育信息化步伐的加快,传统的手工管理方式已难以满足明德小学对教师档案管理的需求。教师档案作为学校重要的人力资源信息库,不仅记录了每位教师的......
  • java计算机毕业设计教育培训机构信息管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着教育行业的蓬勃发展,教育培训机构作为知识传播与技能提升的重要平台,其管理效率与服务质量直接关乎学员的学习体验与机构的可持续发展。然而,传统的......
  • 二,MyBatis -Plus 关于映射 Java Bean 对象的注意事项和细节(详细说明)
    二,MyBatis-Plus关于映射JavaBean对象的注意事项和细节(详细说明)文章目录二,MyBatis-Plus关于映射JavaBean对象的注意事项和细节(详细说明)1.映射2.表的映射3.字段映射4.字段失效5.视图属性6.总结:7.最后:1.映射这里的映射:是指将从数据库查询到的信......