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

Java--网络编程(一)

一.Socket套接字

Socket是一种通信机制,允许不同机器上的进程通过网络进行数据交换,他是应用层与传输层之间的桥梁,封装了TCP/IP族协议的细节

针对传输层协议分为三类:

1.流套接字:使用传输层TCP协议(Transmission Control Protocol)

                     特点:有连接,可靠传输,面向字节流

2.数据报套接字:使用传输层UDP协议(User Datagram Protocol)

                      特点:无连接,不可靠传输,面向数据报

3.原始套接字(不重要):⽤于⾃定义传输层协议,⽤于读写内核没有处理的IP协议数据

二..数据报套接字

在Java中,主要用 DatagramSocket 类来创建数字报套接字

DatagramSocket 构造方法:

1.无参

DatagramSocket socket = new DatagramSocket();

这种构造方法系统会自动分配一个端口号,适用于客户端和不需要固定端口的服务端。

2.固定端口号

DatagramSocket socket = new DatagramSocket(7721);

这种构造方法由程序员指定分配一个端口号,适用于服务端。

DatagramSocket相关方法:

1.void receive(DatagramPacket p)

用来接收数据报,如果没有接收到数据报,会进行阻塞等待。

2.void send(DatagramPacket p)

用来发送数据报(直接发送,不会阻塞等待)

3.void close

关闭数据包套接字

DatagramPacket

DatagramParket 是用来处理 UDP 数据的核心类

主要作用:

数据封装:将要发送或接收的数据打包成UDP数据包格式
地址管理:存储目标或源地址信息(IP地址和端口号)
缓冲区管理:管理数据的字节缓冲区

接收数据报构造方法:

1.DatagramPacket(byte[] buf,int length) 

buf :数据缓冲区,用于临时存放要发送的字节数据

length :缓冲区长度

2.DatagramPacket(byte[] buf,int offset,int length)

offset:缓冲区起始偏移量(offset 就是相当于数据的起始位置)

发送数据报的构造方法:

1.DatagramPacket(byte[] buf,int length,IntAddress address,int port)

address : 目标IP地址

port : 目标端口号

2.DatagramPacket(byte[] buf,int offset,int length,IntAddress address,int port)

DatagramPacket 相关方法:

IntAddress getAddress():

从接收的数据报中获取发送端主机的IP地址

int getPart():

从接收的数据报中获取发送端主机的端口号

byte[] getData():

获取数据报中的数据

IntSocketAddress:

SocketAddress 主要通过 IntSocketAddress 来构建。发送数据包的构建方法里面要用到SocketAddress

IntSocketAddress 构造方法

1.IntSocketAddress(IntAddress addr,int port)

addr:主机IP地址

port:端口号

实例代码演示:

UDP Echo Server : 服务端

import java.io.IOException;
import java.net.*;public class EdpChoServe {private DatagramSocket socket = null;public EdpChoServe(int port) throws SocketException {socket = new DatagramSocket(port);}public void start() throws IOException {System.out.println("服务器启动");while (true){//创建接收缓冲区DatagramPacketDatagramPacket requestparcket = new DatagramPacket(new byte[1024],1024);//接收客户端数据socket.receive(requestparcket);//将数据转化为字符串类型String request = new String(requestparcket.getData(),0, requestparcket.getLength());//将转化后的数据通过process方法进行处理(此处直接返回,如果要进行相关数据的处理直接修改process方法)String response = process(request);//再次创建DatagramPacket套接字,将加工的数据给客户端发送DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestparcket.getSocketAddress());//发送数据socket.send(responsePacket);//打印客户端地址,端口,请求和相应信息System.out.printf("[%s:%d] req:%s,resp:%s\n",requestparcket.getAddress().toString(),requestparcket.getPort(),request,response);}}private String process(String request){String response = "服务端返回的消息:"+request;return response;}public static void main(String[] args) throws IOException {EdpChoServe serve = new EdpChoServe(1010);serve.start();}
}

UDP Echo Client: 客户端

import java.io.IOException;
import java.net.*;
import java.util.Scanner;public class EdpChoClient {private DatagramSocket socket = null;private String IP;private int Port;public EdpChoClient(String ip,int port) throws SocketException {socket = new DatagramSocket();this.IP = ip;this.Port = port;}public void start() throws IOException {System.out.println("客户端启动");Scanner scanner = new Scanner(System.in);while (true){//输入要传输的内容String request = scanner.next();//创建DatagramPacket来储存数据 字节数组,数组长度,IP地址和端口号DatagramPacket requestpacket = new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(this.IP),this.Port);//发送数据socket.send(requestpacket);DatagramPacket responsePacket = new DatagramPacket(new byte[1024],1024);//接收客户端处理后的消息socket.receive(responsePacket);//转化为 String 类型String response = new String(responsePacket.getData(),0,responsePacket.getLength());//打印System.out.println(response);}}public static void main(String[] args) throws IOException {EdpChoClient client = new EdpChoClient("127.0.0.1",1010);client.start();}
}

http://www.dtcms.com/a/471138.html

相关文章:

  • 购物网站建设教程中国十大网站建设公司排名
  • web后端开发——原理
  • 如何把网站放在根目录300m空间够用吗 wordpress
  • 上海高端网站公司哪家好网站意识形态建设
  • 软件设计师-计算机网络-IP地址
  • 5000人网站开发交通建设集团网站
  • 谁分享一个免费网站2021discuz论坛门户网站模板
  • 从入门到精通【Redis】初识Redis集群(Cluster)
  • IDF 定时器
  • 怎么做网站引流做网站服务器需要自己提供吗
  • 烟台市牟平区建设局网站石家庄今天最新新闻头条
  • 天津市做网站的公司有哪些ppt模板免费下载完整版免费网站
  • “数据化学习者”的存在论阐释:量化自我对学习主体性的形塑与异化
  • UG NX二次开发(Python)-tag_t转换为int
  • HOW - 如何使用 bundle-analyzer 工具优化包体积
  • 手机站建设o2o商城网站系统开发
  • 国产三维CAD皇冠CAD(CrownCAD)在「汽车零部件」建模教程:发动机零件
  • 中国网站的建设无锡企业做网站
  • systemd-journald和rsyslogd日志配置详解
  • figma打开编辑器时发生错误
  • 网站备案有效期知乎问答网站开发教程
  • ArkTS 与 TypeScript:鸿蒙生态下的语言演进与实践指南
  • AI 赋能 IBMS 集成系统:从 “数据集成中枢” 到 “智慧决策大脑” 的跃升
  • 做医疗网站颜色选择杭州网页设计招聘网
  • 力扣面试经典150题day3第五题(lc69),第六题(lc189)
  • 做网站去哪好盘锦威旺做网站建设
  • 字符串相关的方法有哪些?
  • 标签预制体上的组件
  • cms免费企业网站湖南网站模板建站
  • 【流氓软件】流氓软件及处理方法