Java的Socket编程实例

2023-11-02

socket简介

套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。

代码解释

Socket编程可以使用 TCP协议,也可以使用UDP协议,我这里使用的是TCP协议的代码,运行的时候先运行服务器端,再运行客户端。

服务端

package org.somken.test;

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Calendar;
   
 /**
 * 服务器端
 *author 周谦
*/
 public class SocketSServer {  
     public static void main(String[] args) throws IOException {  
         System.out.println("服务器开始运行...\n");  
   
       //创建侦听传入连接的服务器套接字
		//端口10000上的请求。 
        ServerSocket server = new ServerSocket(10000);  
  
         while (true) {  
  
            //侦听来自客户端的传入连接请求
			//programs,建立连接,返回socket
			//表示此连接的对象。
             Socket s = server.accept();  
             System.out.println("接受连接中...\n");  
  
           //启动一个线程来处理连接。  
            new ServerThread(s).start();  
   
         }  
     }  
 }  
 class ServerThread extends Thread {  
	      private Socket s;  
	    
	      ServerThread(Socket s) {  
	          this.s = s;  
	      }  
	    
	      public void run() {  
	          BufferedReader br = null;  
	          PrintWriter pw = null;  
	    
	          try {  
	            //创建一个链接到套接字的输入流读取器
				//面向字节的输入流。输入流读取器
				//将从套接字读取的字节转换为字符。这个
				//转换基于平台的默认字符
				//设置。
	              InputStreamReader isr;  
	              isr = new InputStreamReader(s.getInputStream());  
	    
	              //创建一个链接到输入流的缓冲读取器  
	              br = new BufferedReader(isr);  
	    
	              /*创建一个链接到套接字面向字节的输出流的打印写入程序。打印作者创建
					将发送到套接字的字符转换为字节的中间输出流编写器。转换
					基于平台的默认字符集。  
					*/
	              pw = new PrintWriter(s.getOutputStream(), true);  
	    
	              //创建可以获取日期和时间信息的日历。 
	              Calendar c = Calendar.getInstance();  
	    
	           
	              do {  
	                  //获取客户端程序的下一个命令。  
	                  String cmd = br.readLine();  
	    
	                  // 如果客户端程序已关闭其输出流,则退出。 
	                  if (cmd == null)  
	                      break;  
	    
	                  //将命令转换为大写,以便于比较。
	                  cmd = cmd.toUpperCase();  
	    
	                  // 如果客户端程序发送bye命令,则终止。 
	                  if (cmd.startsWith("BYE"))  
	                      break;  
	    
	                  // 如果客户端程序发送日期或时间命令,则将当前日期/时间返回给客户端程序。
	                  if (cmd.startsWith("DATE") || cmd.startsWith("TIME"))  
	                      pw.println(c.getTime().toString());  
	    
	                  //如果客户端程序发送dom(月日)命令,则将当前月日返回给客户端程序。 
	                  if (cmd.startsWith("DOM"))  
	                      pw.println("" + c.get(Calendar.DAY_OF_MONTH));  
	    
	                  // 如果客户端程序发送dow(星期几)命令,
	                  //则将当前工作日(作为字符串)返回给客户端程序。
	                  if (cmd.startsWith("DOW"))  
	                      switch (c.get(Calendar.DAY_OF_WEEK)) {  
	                      case Calendar.SUNDAY:  
	                          pw.println("SUNDAY");  
	                          break;  
	    
	                      case Calendar.MONDAY:  
	                          pw.println("MONDAY");  
	                          break;  
	    
	                      case Calendar.TUESDAY:  
	                          pw.println("TUESDAY");  
	                          break;  
	    
	                      case Calendar.WEDNESDAY:  
	                          pw.println("WEDNESDAY");  
	                          break;  
	    
	                      case Calendar.THURSDAY:  
	                          pw.println("THURSDAY");  
	                          break;  
	    
	                      case Calendar.FRIDAY:  
	                          pw.println("FRIDAY");  
	                          break;  
	    
	                      case Calendar.SATURDAY:  
	                          pw.println("SATURDAY");  
	                      }  
	    
	                  // 如果客户端程序发送doy(一年中的某一天)命令,则将当前的一年中的某一天返回给客户端程序 
	                  if (cmd.startsWith("DOY"))  
	                      pw.println("" + c.get(Calendar.DAY_OF_YEAR));  
	    
	                  //  如果客户端程序发送暂停命令,则睡眠3秒钟。
	                  if (cmd.startsWith("PAUSE"))  
	                      try {  
	                          Thread.sleep(3000);  
	                      } catch (InterruptedException e) {  
	                      }  
	              } while (true);  
	          } catch (IOException e) {  
	              System.out.println(e.toString());  
	          } finally {  
	              System.out.println("关闭连接...\n");  
	              try {  
	                  if (br != null)  
	                      br.close();  
	    
	                  if (pw != null)  
	                      pw.close();  
	    
	                  if (s != null)  
	                      s.close();  
	              } catch (IOException e) {  
	              }  
	          }  
	      }  
	  }  

客户端代码

package org.somken.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

/**
 author 周谦
*/
 public class SocketSClient {  
     public static void main(String[] args) {  
         String host = "localhost";  
   
         // 如果用户指定命令行参数,则该参数表示主机名。  
         if (args.length == 1)  
            host = args[0];  
   
        BufferedReader br = null;  
        PrintWriter pw = null;  
         Socket s = null;  
   
        try {  
             //创建一个套接字,尝试连接到位于端口10000的主机上的服务器程序。  
             s = new Socket(host, 10000);  
   
             InputStreamReader isr;  
             isr = new InputStreamReader(s.getInputStream());  
   
           
             br = new BufferedReader(isr);   
             pw = new PrintWriter(s.getOutputStream(), true);  
   
             // 向服务器发送日期命令。
             pw.println("DATE");  
   
             // 获取并打印当前日期/时间。
             System.out.println(br.readLine());  
   
             // 向服务器发送暂停命令。这允许多个客户端启动并验证服务器是否正在生成多个线程。
             pw.println("PAUSE");  
             // 向服务器发送dow命令。
   
             pw.println("DOW");  
   
             // 获取并打印当前星期几。
            System.out.println(br.readLine());  
   
             // 将dom命令发送到服务器。
             pw.println("DOM");  
   
             // 获取并打印当前月份的日期。
             System.out.println(br.readLine());  
   
             // 将doy命令发送到服务器。
            pw.println("DOY");  
   
             // 获取并打印当前日期。
             System.out.println(br.readLine());  
        } catch (IOException e) {  
             System.out.println(e.toString());  
         } finally {  
            try {  
                 if (br != null)  
                    br.close();  
                if (pw != null)  
                    pw.close();  
                 if (s != null)  
                     s.close();  
            } catch (IOException e) {  
             }  
         }  
     }  
 }  


代码就到这里了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java的Socket编程实例 的相关文章

  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • adamax参数_5 Optimizer-庖丁解牛之pytorch

    优化器是机器学习的很重要部分 但是在很多机器学习和深度学习的应用中 我们发现用的最多的优化器是 Adam 为什么呢 pytorch有多少优化器 我什么时候使用其他优化器 本文将详细讲述 在torch optim 包中有如下优化器torch
  • 从ChatGPT到ChatCAD:基于大型语言模型的医学图像交互式计算机辅助诊断

    1 导读 2023年年初最火热的话题之一就是OpenAI的ChatGPT1 给人类带来了巨大的冲击 1月底 美国 财富 杂志2 3月合刊的封面文章 全球爆红的ChatGPT是如何诞生的 引爆了创投圈 在这巨大的浪潮冲击下 如何让其在医疗领域
  • 某公司员工的工资计算方法如下:一周内工作时间不超过40小时,按正常工作时间计酬;超出40小时的工作时间部分,按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工,进公司不少于5年的员工

    简单计算工资 张景敏 2021 1 22 include
  • 多物理场仿真 Chrono 转向机构

    为方便查阅 此文是原网站文档翻译 如有侵权 请与本人联系 目录 转向垂臂 齿条小齿轮 旋转臂 基础类别ChSteering规定 任何衍生的转向机构类别 转向机构模板 都提供了一个转向连杆体 可转向悬架可以连接到该转向连杆体上 通常通过悬架的
  • chrome下载

    https zhuanlan zhihu com p 438998185
  • Docker基础修炼1--Docker简介及快速入门体验

    本文作为Docker基础系列第一篇文章 将详细阐述和分析三个问题 Docker是什么 为什么要用Docker 如何快速掌握Docker技术 本系列文章中Docker的用法演示是基于CentOS7进行 因此假设读者已经掌握了初步的Linux知
  • 使用选择排序和二分法对传入的数组进行排序和查找

    选择排序和二分法 使用二分法查找数组中某个值得位置是要在数组提前排好序的前提下才能使用 所以要将数组进行排序 数组排序有冒泡排序 选择排序 插入排序等 今天我们使用选择排序对数组进行排序 测试类代码如下图 运行结果如下图 位置为i 1 所以
  • JSP基础理论

    来自 千峰涛哥B站资料 一 JSP概述 1 1 Servlet使用的不足 Servlet是一个动态网页技术 客户端通过请求Servlet类可以相应给客户端一个动态网页 但是Servlet在使用过程中有什么不足之处呢 开发方式麻烦 继承Htt
  • 在Java基础上对比学习C#基本语法

    文章目录 一 引包 二 构造函数 三 析构函数 四 C 数据类型 五 加框 boxing 和消框 unboxing 六 运算符 七 控制语句 八 类的继承 九 方法参数的种类 十 操作符重载 十一 this关键字 十二 类的多态 十三 抽象
  • 目标检测模型的评价指标 mAP

    在使用机器学习解决实际问题时 通常有很多模型可用 每个模型都有自己的怪癖 quirks 并且基于各种因素 性能会有所不同 模型性能的评定都是在某个数据集上进行的 通常这个数据集被称为 validation 或 test 数据集 模型性能的评
  • Java+Swing形成GUI图像界面

    一 Swing 简介 Swing 主要用来开发 GUI 程序 GUI Graphical User Interface 即图形用户界面 Java 中针对 GUI 设计提供了丰富的类库 这些类分别位于 java awt 和 java swin
  • Android高仿qq及微信底部菜单的几种实现方式

    文章目录 导航类型 第一种方式 侧滑菜单 底部导航 已经实现聊天 表情 图片 位置 语音等信息的发送 第二种方式 Fragment PopupWindow仿QQ空间最新版底部菜单栏 第三种方式 FragmentTabHost实现qq底部Ta
  • (一)在ubuntu20.04安装VPN服务

    很多时候需要从世界各地来访问公司服务器 电脑 工厂设备 实现方式有很多种 主要分为VPN和内网穿透方式 但是他们俩都存在一些问题 例如内网穿透主要利用外网IP 端口映射内网IP地址 端口方式 需要在设备端 电脑端装软件 例如frp方式需要在
  • 5.C++力扣刷题645

    题目 集合 s 包含从 1 到 n 的整数 不幸的是 因为数据错误 导致集合里面某一个数字复制了成了集合里面的另外一个数字的值 导致集合丢失了一个数字并且有一个数字重复 给定一个数组 nums 代表了集合 S 发生错误后的结果 请你找出重复
  • 最大子数组问题

    最大子数组问题 本文只是做一个记录 更细致的思路请查看算法导论 最大子数组结构体 typedef struct int low high sum SubArray 暴力求解 计算所有的数组区间的和进而得到最大的子数组 算法复杂度为 n 这种
  • TypeError: _open() got an unexpected keyword argument 'as_grey'

    报错 TypeError open got an unexpected keyword argument as grey 解决方法 把caffe io load imga读取图片改成cv2读取 image cv2 imread imageP
  • Windows设置IP地址

    控制面板里的 网络和共享中心 里可以设置IP地址 如果里面是 自动IP地址 电脑的IP地址就会 变化莫测 手动设置就可以避免这种问题 自动IP地址 其实这就是电脑的默认设置 修改路径如下 随便打开一个文件夹 gt 在地址栏输入 控制面板 g
  • kaggle入门(二)——Spaceship Titanic

    Spaceship Titanic KagglePredict which passengers are transported to an alternate dimensionhttps www kaggle com competiti
  • CentOS7安装Hadoop和zookeeper的各种问题

    最近在上大数据选修课 课程实验需要在CentOS上安装Hadoop和zookeeper 遇到了很多问题 记录一下 原本准备从头写个完整的安装记录的 发现我实在是不想回头看一遍了 就记录一些需要注意的地方吧 虚拟机的安装 安装过程按照书上面来
  • Java的Socket编程实例

    socket简介 套接字 socket 是一个抽象层 应用程序可以通过它发送或接收数据 可对其进行像对文件一样的打开 读写和关闭等操作 套接字允许应用程序将I O插入到网络中 并与网络中的其他应用程序进行通信 代码解释 Socket编程可以