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

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

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

InetAddress类

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

InetSocketAddress抽象基类,子类SocketAddress

构造方法

java 复制代码
 public SocketAddress(InetAddress inetAddress,int port){...}  //InetAddress对象+端口号

客户端(socket)

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

方法

java 复制代码
 OutputStream getOutputStream()      //获取字节输出流对象
 IntputStream getInputStream()        //获取字节输入流对象

服务器端(SereverSocket)

java 复制代码
 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();

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

java 复制代码
 socket.shutDownOutout();    //写信息结束
 socket.shutDownInput();     //读信息结束

UDP

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

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

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

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

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

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

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

客户A(服务器端)

java 复制代码
 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(客户端)

java 复制代码
 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();
     }
 }
 ​
相关推荐
域智盾软件14 分钟前
电脑加密软件 5 个高频问题:选型、落地、排错一次讲清
网络·电脑
http阿拉丁神猫1 小时前
Go语言入门笔记:从基础到开发环境搭建(二)
开发语言·笔记·golang
不会就选b2 小时前
C++补充部分(一)--lambda 表达式
开发语言·c++
Pniubi5 小时前
HashMap的扩容和树化边界
java·开发语言
Mikko75 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师5 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.6 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
Eloudy6 小时前
全文 - IMEX 第01节 -IMEX overview
运维·服务器·网络
秋饼6 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
物联网软硬件开发-轨物科技7 小时前
【技术白皮书】光伏清检一体化机器人系统解决方案技术白皮书
大数据·运维·网络·人工智能·机器人