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();
     }
 }
 ​
相关推荐
摇滚侠1 分钟前
Spring Boot 3零基础教程,WEB 开发 HttpMessageConverter @ResponseBody 注解实现内容协商源码分析 笔记33
java·spring boot·笔记
静心观复19 分钟前
drawio画java的uml的类图时,class和interface的区别是什么
java·uml·draw.io
moringlightyn19 分钟前
c++11可变模版参数 emplace接口 新的类功能 lambda 包装器
开发语言·c++·笔记·其他·c++11·lambda·包装器
Laplaces Demon20 分钟前
Spring 源码学习(十四)—— HandlerMethodArgumentResolver
java·开发语言·学习
郝学胜-神的一滴24 分钟前
使用Linux系统函数递归遍历指定目录
linux·运维·服务器·开发语言·c++·软件工程
guygg8824 分钟前
Java 无锁方式实现高性能线程
java·开发语言
ss27326 分钟前
手写Spring第7弹:Spring IoC容器深度解析:XML配置的完整指南
java·前端·数据库
我也要当昏君1 小时前
6.3 文件传输协议 (答案见原书 P277)
网络
青衫码上行1 小时前
【从0开始学习Java | 第22篇】反射
java·开发语言·学习
superlls1 小时前
(Spring)Spring Boot 中 @Valid 与全局异常处理器的联系详解
java·spring boot·后端