当前位置: 首页 > 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.gsyq.cn/news/69146.html

相关文章:

  • IDEA标签窗口好行显示 类注释和方法注释
  • LabVIEW用直线边缘检测实现液位测量 - 教程
  • HEK293细胞:为什么它是重组蛋白表达的黄金标准?
  • 树莓派Docker部署AdGuard Home
  • 人工智能发展史简述
  • 第四天敏捷冲刺
  • 读书笔记 XILINX ug1137-Zynq UltraScale+ MPSoC Software Developer Guide 软件开发者指南 Chapter1Chapter2
  • Java创建对象完整流程详解
  • re笔记5
  • 北京陪诊公司排行:专业服务破解就医难题,三甲机构树立行业标杆
  • 北京上门收酒茅台五粮液洋酒老酒名酒董酒习酒
  • 北京上门收酒茅台五粮液洋酒老酒名酒
  • this view is read-only (IntelliJ IDEA) - 详解
  • 内存管理-55-工具-page_types - Hello
  • 2025年LED显示屏经销最新推荐,室内LED显示屏,户外LED显示屏,单色LED显示屏,全彩LED显示屏选择指南!
  • 糖尿病预测(较好的代码)
  • 北京上门收酒
  • AIM:用 AI 写 Git 提交信息
  • rllm中的推理流程
  • 第2天敏捷冲刺 - Helen
  • OOP-实验4
  • 成群结队-冲刺日志(阶段一)
  • 成群结队-冲刺日志(阶段三)
  • POLIR-Logic-逻辑学: Propositional→FOL→SOL→HOL→Categoties
  • 集成光子技术革新AI数据中心,提升能效与带宽
  • STM32F103ZET6开发板串口只发不收问题解决 - PC2005
  • 做题记录(Dec.)
  • C数据结构--排序算法 - 详解
  • 12/2总结
  • leetcode49. 字母异位词分组