当前位置: 首页 > news >正文

Java进阶网络编程,UDP,TCP通信

网络编程

  • IP地址:设备在网络中的地址,是设备在网络中的唯一标识
    • Ipv4:使用32位地址(4个字节),通常以点分十进制表示
    • Ipv6:128位(16个字节)采用冒分十六进制表示法
  • 端口:应用程序在设备中的唯一标识
  • 协议:连接和数据在网络中传输的规则
  • IP域名:识别和定位网站的人类可读的名称,例如:www.baidu.com
  • DNS域名解析
  • 公网IP:是可以连接到互联网的IP地址
  • 内网IP:也叫局域网IP,只能组织内部使用
  • 127.0.0.1,localhost:代表本机IP
  • 电脑物理IP不变

UDP通信

  • 消息的一发一收
//客服端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class UDPClientDemo1 {public static void main(String[] args)throws Exception {System.out.println("客服端启动");//创建发送端对象(相当于抛韭菜的人)DatagramSocket socket = new DatagramSocket();//创建数据包对象封装要发生的数据(相当于韭菜盘子)byte[] bytes="上号!!".getBytes();DatagramPacket packet = new DatagramPacket(bytes, bytes.length,InetAddress.getLocalHost(),8080);//发送的数据,发送的字节长度,发送的目的地的IP地址(这里选的是自己的IP地址,以便测试),服务的程序的端口号//让发送端对象发送数据包的数据socket.send(packet);socket.close();}
}
//服务端
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UDPService {public static void main(String[] args) throws Exception {System.out.println("服务端启动");//创建一个接收端对象,注册端口(接韭菜的人)DatagramSocket socket = new DatagramSocket(8080);//创建一个数据包对象负责接收数据(韭菜盘子)byte[] buf = new byte[1024*64];//设置位64K确保够用DatagramPacket packet = new DatagramPacket(buf, buf.length);//接收数据,将数据封装到数据包对象的字节数组中去socket.receive(packet);//查看是否收到了数据packet.getLength();String data = new String(buf,0,packet.getLength());System.out.println(data);//获取对方的IP地址和程序端口String ip=packet.getAddress().getHostAddress();int port=packet.getPort();System.out.println(ip+" "+port);}
}
  • 消息的多发多收:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;public class UDPClientDemo1 {public static void main(String[] args)throws Exception {Scanner sc = new Scanner(System.in);System.out.println("客服端启动");//创建发送端对象(相当于抛韭菜的人)DatagramSocket socket = new DatagramSocket();//发送多条数据while (true) {System.out.println("请说:");String msg = sc.nextLine();if(msg.equals("exit")){System.out.println("客户端退出");socket.close();break;}//创建数据包对象封装要发生的数据(相当于韭菜盘子)byte[] bytes=msg.getBytes();DatagramPacket packet = new DatagramPacket(bytes, bytes.length,InetAddress.getLocalHost(),8080);//发送的数据,发送的字节长度,发送的目的地的IP地址(这里选的是自己的IP地址,以便测试),服务的程序的端口号//让发送端对象发送数据包的数据socket.send(packet);}}
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UDPService {public static void main(String[] args) throws Exception {System.out.println("服务端启动");//创建一个接收端对象,注册端口(接韭菜的人)DatagramSocket socket = new DatagramSocket(8080);//创建一个数据包对象负责接收数据(韭菜盘子)byte[] buf = new byte[1024*64];//设置位64K确保够用DatagramPacket packet = new DatagramPacket(buf, buf.length);//接收多条数据while (true) {//接收数据,将数据封装到数据包对象的字节数组中去socket.receive(packet);//查看是否收到了数据packet.getLength();String data = new String(buf,0,packet.getLength());System.out.println(data);//获取对方的IP地址和程序端口String ip=packet.getAddress().getHostAddress();int port=packet.getPort();System.out.println("对方IP"+ip+"对方端口"+port);System.out.println();}}
}

TCP通信

  • 一发一收
//客户端
public class TCPClientDemo {public static void main(String[] args)throws Exception {System.out.println("客户端启动");//常见Socket管道对象,请求与服务器的Socket建立可靠连接Socket socket = new Socket("127.0.0.1",8888);//从Socket通信管道中得到一个字节输出流OutputStream os = socket.getOutputStream();//特殊数据流DataOutputStream dos = new DataOutputStream(os);dos.writeInt(112120);dos.writeUTF("芒果学代码");socket.close();//关闭资源}
}
//服务端
public class TCPServer {public static void main(String[] args)throws Exception {System.out.println("服务端启动");//创建服务端ServerSocket对象,绑定端口号,建立客户端连接ServerSocket serverSocket = new ServerSocket(8888);//调用accept方法,阻塞等待客户端连接,一旦客户端连接,会返回一个Socket对象Socket socket = serverSocket.accept();//获取输入流,读取客户端发送的数据InputStream is = socket.getInputStream();//把字节输入流包装成特殊数据输入流DataInputStream dis = new DataInputStream(is);//读取数据int id=dis.readInt();String data = dis.readUTF();System.out.println(id+" "+data);//查看客服端的IP和端口System.out.println("客户端的IP:"+socket.getInetAddress().getHostAddress());System.out.println("客户端的端口:"+socket.getPort());}
}
  • 多发多收
//客户端
public class TCPClientDemo {public static void main(String[] args)throws Exception {System.out.println("客户端启动");//常见Socket管道对象,请求与服务器的Socket建立可靠连接Socket socket = new Socket("127.0.0.1",8888);//从Socket通信管道中得到一个字节输出流OutputStream os = socket.getOutputStream();//特殊数据流DataOutputStream dos = new DataOutputStream(os);dos.writeInt(112120);Scanner sc = new Scanner(System.in);while (true) {System.out.println("请说:");String str = sc.nextLine();if(str.equals("exit")){System.out.println("退出成功!");socket.close();break;}dos.writeUTF(str);//发送数据dos.flush();}}
}
//服务端
public class TCPServer {public static void main(String[] args)throws Exception {System.out.println("服务端启动");//创建服务端ServerSocket对象,绑定端口号,建立客户端连接ServerSocket serverSocket = new ServerSocket(8888);//调用accept方法,阻塞等待客户端连接,一旦客户端连接,会返回一个Socket对象Socket socket = serverSocket.accept();//获取输入流,读取客户端发送的数据InputStream is = socket.getInputStream();//把字节输入流包装成特殊数据输入流DataInputStream dis = new DataInputStream(is);while (true) {//读取数据String data = dis.readUTF();//等待读取客户端的消息System.out.println(data);//查看客服端的IP和端口System.out.println("客户端的IP:"+socket.getInetAddress().getHostAddress());System.out.println("客户端的端口:"+socket.getPort());System.out.println();}}
}
  • 同时接收多个客户端消息
//多线程
public class ServerReader extends Thread{private Socket socket;public ServerReader(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {//获取输入流,读取客户端发送的数据InputStream is = socket.getInputStream();//把字节输入流包装成特殊数据输入流DataInputStream dis = new DataInputStream(is);while (true) {//读取数据String data = dis.readUTF();//等待读取客户端的消息System.out.println(data);//查看客服端的IP和端口System.out.println("客户端的IP:"+socket.getInetAddress().getHostAddress());System.out.println("客户端的端口:"+socket.getPort());System.out.println();}} catch (IOException e) {e.printStackTrace();System.out.println("客户端下线了"+socket.getInetAddress().getHostAddress());}}
}
//服务端
public class TCPServer {public static void main(String[] args)throws Exception {System.out.println("服务端启动");//创建服务端ServerSocket对象,绑定端口号,建立多个客户端连接ServerSocket serverSocket = new ServerSocket(8888);//调用accept方法,阻塞等待客户端连接,一旦客户端连接,会返回一个Socket对象Socket socket = serverSocket.accept();System.out.println("一个客户端上线了"+socket.getInetAddress().getHostAddress());//把这个客户端管道交给一个独立的子线程专门负责接收这个管道的消息new ServerReader(socket).start();}
}
//客户端
public class TCPClientDemo {public static void main(String[] args)throws Exception {System.out.println("客户端启动");//常见Socket管道对象,请求与服务器的Socket建立可靠连接Socket socket = new Socket("127.0.0.1",8888);//从Socket通信管道中得到一个字节输出流OutputStream os = socket.getOutputStream();//特殊数据流DataOutputStream dos = new DataOutputStream(os);dos.writeInt(112120);Scanner sc = new Scanner(System.in);while (true) {System.out.println("请说:");String str = sc.nextLine();if(str.equals("exit")){System.out.println("退出成功!");socket.close();break;}dos.writeUTF(str);//发送数据dos.flush();}}
}
http://www.jsqmd.com/news/58740/

相关文章:

  • CCPC郑州站 笨蛋题 II
  • IDEA标签窗口好行显示 类注释和方法注释
  • LabVIEW用直线边缘检测实现液位测量 - 教程
  • HEK293细胞:为什么它是重组蛋白表达的黄金标准?
  • kettle从入门到精通 第111课 ETL之kettle webspoon7的docker部署详细教程
  • 树莓派Docker部署AdGuard Home
  • 人工智能发展史简述
  • 第四天敏捷冲刺
  • qy_蓝桥杯编程系列_编程17 好数
  • 读书笔记 XILINX ug1137-Zynq UltraScale+ MPSoC Software Developer Guide 软件开发者指南 Chapter1Chapter2
  • static相关
  • 74_基于深度学习的垃圾桶垃圾溢出检测体系(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
  • Java创建对象完整流程详解
  • PQ v.Next Beta计划与估计
  • re笔记5
  • 北京陪诊公司陪诊师排行
  • 北京陪诊公司排行:专业服务破解就医难题,三甲机构树立行业标杆
  • 【RAG安全】Pirates of the RAG: Adaptively Attacking LLMs to Leak Knowledge Bases - 指南
  • 20232319 2025-2026-1 《网络与系统攻防技术》实验八实验报告
  • 北京上门收酒茅台五粮液洋酒老酒名酒
  • 北京上门收酒茅台五粮液洋酒老酒名酒董酒习酒
  • this view is read-only (IntelliJ IDEA) - 详解
  • 构建高可靠 OpenEuler 运维体系:从虚拟化部署到 Systemd 自动化核心实践 - 教程
  • 内存管理-55-工具-page_types - Hello
  • 2025 年黑猪批发基地品牌推荐排行榜,黑金刚黑猪批发,国寿黑猪批发,杜洛克黑猪批发,沂蒙黑猪批发,太湖原种黑猪批发,三元仔猪黑猪批发,长白仔猪黑猪养殖,黑猪繁育,黑猪仔猪批发,原种黑猪批发基地推荐
  • 2025年必收藏的8款AI论文生成神器!高效写作轻松搞定
  • FWT 学习笔记
  • 补发读后感
  • 北京上门收酒的公司
  • 2025年LED显示屏经销最新推荐,室内LED显示屏,户外LED显示屏,单色LED显示屏,全彩LED显示屏选择指南!