【Socket】Java Socket通信(一)

article/2025/10/15 1:47:11

前段时间在网上学习了Java Socket的应用编程。

端口

  1. 用于区分不同应用程序
  2. 端口号范围065535,其中01023为系统所保留
  3. IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础
  4. http:80 ftp:21 telnet:23

Java中的网络支持

针对网络通信的不同层次,Java提供的网络功能有四大类

  1. InetAddress:用于标识网络上的硬件资源
  2. URL:统一资源定位符,通过URL可以直接读取或写入网络上的数据
  3. Socket:使用TCP协议实现网络通信的Socket相关的类
  4. Datagram:使用UDP协议,将数据保存在数据报中,通过网络进行通信

下面是各个模块的代码模块

InetAddress类

InetAddress类用于标识网络上的硬件资源,表示互联网协议(IP)地址

public class InetAddressDemo {public static void main(String[] args) throws UnknownHostException {//获取本机的InetAdress实例InetAddress address = InetAddress.getLocalHost();System.out.println("计算机名:"+address.getHostName());System.out.println("IP地址"+address.getHostAddress());byte [] bytes = address.getAddress();  // 获取字节数组形式的IP地址System.out.println("字节数组形式的IP:"+Arrays.toString(bytes));System.out.println(address);  //直接输出InetAddress对象}
}

URL

  1. URL(Uniform Resource Locator)统一资源定位符,表示Internet上某一资源的地址

  2. URL由两部分组成:协议名称和资源名称,中间用冒号隔开

                 http://blog.csdn.net/lluozh2015------  ------------------------协议名称          资源名称
    
  3. 在java.net包中,提供了URL类来表示URL

public class URLDemo {public static void main(String[] args) {		try {//创建一个URL实例URL imooc = new URL("http://blog.csdn.net/lluozh2015");//?后面表示参数,#后面表示锚点URL url = new URL(imooc,"/index.html?username=tom#test");System.out.println("协议"+url.getProtocol());System.out.println("主机"+url.getHost());//如果未指定端口号,则使用默认的端口号,此时getport()方法返回值为-1System.out.println("端口:"+url.getPort());System.out.println("文件路径:"+url.getPath());System.out.println("文件名:"+url.getFile());System.out.println("相对路径"+url.getRef());System.out.println("查询字符串"+url.getQuery());} catch (MalformedURLException e) {e.printStackTrace();}}
}

输出的值为:
这里写图片描述

使用URL读取网页内容

  1. 通过URL对象的openStream()方法可以得到指定资源的输入流
  2. 通过输入流可以读取、访问网络上的数据

使用URL读取页面内容:

public class URLDemo2 {public static void main(String[] args) {//创建一个URL实例try {URL url = new URL("http://www.baidu.com");//通过URL对象的openStream方法可以得到指定资源的输入流InputStream is = url.openStream();//将字节输入流转换成字符输入流InputStreamReader isr = new InputStreamReader(is,"UTF-8");//为字符输入流添加缓冲BufferedReader br = new BufferedReader(isr);//读取数据String data = br.readLine();while(data !=null){//循环读取数据System.out.println(data);  //输出数据data = br.readLine();}//br.close();//isr.close();//is.close();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}	}
}

输出的结果为:
这里写图片描述

Socket通信

TCP协议是面向连接、可靠的、有序的,以字节流的方式发送数据
基于TCP协议实现网络通信的类

  1. 客户端的Socket类

  2. 服务端的ServerSocket类

                        **Socket通信模型**
    

这里写图片描述

Socket通信实现步骤

  1. 创建ServerSocket和Socket
  2. 打开连接到Socket的输入/输出流
  3. 按照协议对Socket进行读/写操作
  4. 关闭输入输出流、关闭Socket

这里写图片描述

服务器端:

  1. 创建ServerSocket对象,绑定监听端口
  2. 通过accept()方法监听客户端请求
  3. 连接建立后,通过输入流读取客户端发送的请求信息
  4. 通过输出流向客户端发送响应信息
  5. 关闭相关资源

代码实现:

/** 基于TCP协议的Socket通信,实现用户登录* 服务器端*/
public class ServerDemo {public static void main(String[] args) {try {//1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口ServerSocket serverSocket = new ServerSocket(8099);//2.调用accept()方法开始监听,等待客户端的连接System.out.println("***服务器即将启动,等待客户端的连接***");			Socket socket = serverSocket.accept();//3.获取输入流,并读取客户端信息InputStream is = socket.getInputStream();  //字节输入流  (Ctrl+shift+o 提示需要导入的包)InputStreamReader isr = new InputStreamReader(is);   //将字节流转换为字符流BufferedReader br = new BufferedReader(isr);  //为输入流添加缓冲String info = null;while((info = br.readLine())!=null){ //循环读取客户端的信息System.out.println("我是服务器,客户端说:"+info);}socket.shutdownInput();  //关闭输入流//4.获取输出流,相应客户端的请求OutputStream os = socket.getOutputStream();PrintWriter pw = new PrintWriter(os);  //包装为打印流pw.write("欢迎!");pw.flush();//5.关闭资源pw.close();br.close();isr.close();is.close();socket.close();serverSocket.close();			} catch (IOException e) {e.printStackTrace();}}
}

客户端:

  1. 创建Socket对象,指明需要连接的服务器的地址和端口号
  2. 连接建立后,通过输出流向服务端发送请求信息
  3. 通过输入流获取服务器响应的信息
  4. 关闭相关资源

代码实现

public class ClientDemo {public static void main(String[] args) {		try {//1.创建客户端Socket,指定服务器地址和端口Socket socket = new Socket("localhost",8099);//2.获取输出流,向服务器发送消息OutputStream os = socket.getOutputStream();  //字节输出流PrintWriter pw = new PrintWriter(os);  //将输出流包装为打印流pw.write("用户名:admin;密码:123456");pw.flush();socket.shutdownOutput();//3.获取输入流,并读取服务器端的响应信息InputStream is = socket.getInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);String info = null;while((info=br.readLine())!=null){System.out.println("我是客户端,服务器说:"+info);}//4.关闭资源br.close();isr.close();is.close();pw.close();os.close();socket.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

http://chatgpt.dhexx.cn/article/C7WghfKb.shtml

相关文章

java socket编程总结

java socket编程总结 说明一、TCP/IP协议模型二、获取IP相关信息InetAddressInetSocketAddressURL 三、TCP编程四、UDP编程五、关于TCP与UDP 说明 更新时间:2020/12/01 17:17,更新完基本内容 java的socket编程做一个总结,主要是面向Tcp和Ud…

Java Socket网络编程,你要的实验,我都有

JAVA Socket编程 目录 JAVA Socket编程多人聊天室客户端源代码服务器端源代码运行展示 邮件发送客户端运行展示 在线云笔记客户端窗口服务器端代码运行展示 多人聊天室 客户端源代码 import java.awt.BorderLayout; import java.awt.HeadlessException; import java.awt.event…

【Java高级】初探socket编程 ——JavaSocket连接与简单通信

新学期生活开始一段时间了,要继续学习一些新的技术(这里指socket /doge),目标是尝试完成一个在线即时聊天的小程序(尽量不咕)。会更新一系列socket编程的技术文章,欢迎关注交流~ 那么千里之行&…

Java--Socket通信(双向,有界面)

服务端: import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr…

JAVA 网络编程 Socket

网络:相互连接的计算机,带来的好处有共享资源,交换数据 IP地址:定位计算机地址 通常由网络地址主机地址组合 查看本机IP地址:电脑左下角输入CMD,回车在CMD界面输入ipconfig 127.0.0.1 测试本机网络配置 …

初识Java Socket编程

Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相关的技术。下面就让我们一起揭开Socket的神秘面纱。…

Java socket详解,看这一篇就够了

刚给大家讲解Java socket通信后,好多童鞋私信我,有好多地方不理解,看不明白。特抽时间整理一下,详细讲述Java socket通信原理和实现案例。整个过程楼主都是通过先简单明了的示例让大家了解整个基本原理,后慢慢接近生产…

递归下降文法C语言实验报告,递归下降分析法的简单例子的c语言实现

我们举的简单例子是 G[s]: S → a | ∧ | (T) T→T, S | S 转化为LL1文法 S →a |∧| (T) T →ST T→,ST| ε c语言代码实现 #include char scaner(char*input,int* p); void S(char*input,int* p); void T(char*input,int* p); void T1(char*input,int* p); void error(); int…

C++:编译实验之递归下降分析器

一、实验目的 1.加深对递归下降分析法一种自顶向下的语法分析方法的理解。 2.根据文法的产生式规则消除左递归,提取公共左因子构造出相应的递归下降分析器。 二、实验内容 根据课堂讲授的形式化算法,编制程序实现递归下降分析器,能对常见…

递归下降分析程序的设计和实现

递归下降分析程序的设计和实现 一、实验的目的和要求 1、了解语法分析的主要任务。 2、实现基本的递归下降分析器,能够分析任意的符号串是否为该文法所定义的合法算术表达式。二、实验环境 Windows7 Dev-C三、实验准备 先将递归下降分析程序的生成认真的学习一…

利用递归下降分析方法完成语法分析

一、 程序设计题目与说明 利用递归下降分析方法完成语法分析。 递归下降分析法是一种自顶向下的分析方法,文法的每个非终结符对应一个递归过程(函数)。分析过程就是从文法开始符出发执行一组递归过程(函数)&#xff…

编译原理 --- 递归下降分析器

第一部分 --- 构造递归下降分析器 1.在上面这个例子中则是子程序序A先调用子程序B,本程序结束完调用之后再返回来继续调用下一个符号 如果下一个符号是终结符的话那就直接进行匹配,不进行调用,匹配完后继续调用下一个符号 如果不是的话则调…

递归下降分析法实现强化计算器

一. 实验概述 1.使用bison 和 flex 实现扩展版计算器 该计算器支持实型的两种表达,分别是小数和科学计数法. 该计算器支持 加, 减, 乘 除 四种运算 和括号()运算符. 该计算器支持整形,实型混合运算 2.通过递归下降分析法自行编写的语法分析和使用flex进行的词法分析的计算器.…

编译原理研究性学习专题 2——递归下降语法分析设计原理与实现

1 实验内容 完成以下描述赋值语句的 LL(1)文法的递归下降分析程序 G[S]: S→ VE E→ TE’ E’→ ATE’ | e T→ FT’ T’→ MFT’ | E F→ (E) | i A→ | - M→ * | / V→ i 设计说明:终结符号 i 为用户定义的简单变量,即标识符的定义。 2 实验要求 …

Python技法之简单递归下降Parser的实现方法

文章目录 一. 算术运算表达式求值二. 生成表达式树三、左递归和运算符优先级陷阱四. 相关包 一. 算术运算表达式求值 对于简单的算术运算表达式,假定我们已经用分词技术将其转化为输入的tokens流,如NUMNUM*NUM。 在此基础上,我们定义BNF规则…

编译实验 . 递归下降分析器

实验目的: 1.1掌握语法分析方法。 1.2掌握使用算符优先分析法。 1.3完成语法分析程序的设计和实现。 1.4程序能完成对指定语言的语法分析。 2. 递归下降分析器 在不含左递归和每个非终结符的所有候选终结首符集都两两不相交的条件下,我们就可能构造…

用c语言编译递归下降翻译器,Java实现C语言语义分析(递归下降)

说起这次的语义分析,不得不说的是我的重大的改变。上一次的语法分析是利用了预测分析法来实现的,经过多方考证,发现用预测分析法的语法分析器基础来实现语义分析的困难重重,例如在语法指导翻译的时候那个栈的变化和各种属性的传递…

递归下降分析法

介绍: 递归下降分析法是针对LL(1)文法的一种语法分析方法; 通过对文法的消除左递归,提取左公因子,对各个产生式和非终结符求first()和follow()集,通过first()和follow()集构造该文法的预测分析表,当这个预…

编译原理实验-递归下降语法分析

具体代码已放至Github(仅供参考): qxpBlog/Compiler_UESTC: 电子科技大学编译原理实验 (github.com) 具体实验过程如下: 一、实验目的、原理、内容及步骤: (1)目的:通过本实验加深…

编译原理实验--实验二 递归下降法判断算术表达式的正确性--Python实现

目录 一、实验目的和要求 二、实验内容 三、实验环境 四、实验步骤 1、语法分析所依据的文法; 2、给出消除左递归及提取左公因子的文法; 五、测试要求 六、实验步骤 1、语法分析所依据的文法 2、给出消除左递归及提取左公因子的文法&#xff1…