戳上面的蓝字关注我们哦!

精彩内容

精选java等全套视频教程

精选java电子图书

大数据视频教程精选

java项目练习精选

网络编程示例

“实践出真知”,所以在进行技术学习时,还是需要进行很多的练习,才可以体会技术的奥妙,下面通过两个简单的示例,演示网络编程的实际使用。

1.3.1质数判别示例

该示例实现的功能是质数判断,程序实现的功能为客户端程序接收用户输入的数字,然后将用户输入的内容发送给服务器端,服务器端判断客户端发送的数字是否是质数,并将判断的结果反馈给客户端,客户端根据服务器端的反馈显示判断结果。

质数的规则是:最小的质数是2,只能被1和自身整除的自然数。当用户输入小于2的数字,以及输入的内容不是自然数时,都属于非法输入。

网络程序的功能都分为客户端程序和服务器端程序实现,下面先描述一下每个程序分别实现的功能:

1、 客户端程序功能:

  • 接收用户控制台输入

  • 判断输入内容是否合法

  • 按照协议格式生成发送数据

  • 发送数据

  • 接收服务器端反馈

  • 解析服务器端反馈信息,并输出

2、 服务器端程序功能:

  • 接收客户端发送数据

  • 按照协议格式解析数据

  • 判断数字是否是质数

  • 根据判断结果,生成协议数据

  • 将数据反馈给客户端

分解好了网络程序的功能以后,就可以设计网络协议格式了,如果该程序的功能比较简单,所以设计出的协议格式也不复杂。

客户端发送协议格式:

  • 将用户输入的数字转换为字符串,再将字符串转换为byte数组即可。

  • 例如用户输入16,则转换为字符串“16”,使用getBytes转换为byte数组。

  • 客户端发送“quit”字符串代表结束连接

服务器端发送协议格式:

  • 反馈数据长度为1个字节。数字0代表是质数,1代表不是质数,2代表协议格式错误。

  • 例如客户端发送数字12,则反馈1,发送13则反馈0,发送0则反馈2。

功能设计完成以后,就可以分别进行客户端和服务器端程序的编写了,在编写完成以后联合起来进行调试即可。

下面分别以TCP方式和UDP方式实现该程序,注意其实现上的差异。不管使用哪种方式实现,客户端都可以多次输入数据进行判断。对于UDP方式来说,不需要向服务器端发送quit字符串。

以TCP方式实现的客户端程序代码如下:

package example1;
import java.io.*;
import java.net.*;
/*** 以TCP方式实现的质数判断客户端程序*/
public class TCPPrimeClient {static BufferedReader br;static Socket socket;static InputStream is;static OutputStream os;/**服务器IP*/final static String HOST = "127.0.0.1";/**服务器端端口*/final static int PORT = 10005;public static void main(String[] args) {init(); //初始化while(true){System.out.println("请输入数字:");String input = readInput(); //读取输入if(isQuit(input)){ //判读是否结束byte[] b = "quit".getBytes();send(b);break; //结束程序}if(checkInput(input)){ //校验合法//发送数据send(input.getBytes());//接收数据byte[] data = receive();//解析反馈数据parse(data);}else{System.out.println("输入不合法,请重新输入!");}}close(); //关闭流和连接}/*** 初始化*/private static void init(){try {br = new BufferedReader(new InputStreamReader(System.in));socket = new Socket(HOST,PORT);is = socket.getInputStream();os = socket.getOutputStream();} catch (Exception e) {}}/*** 读取客户端输入*/private static String readInput(){try {return br.readLine();} catch (Exception e) {return null;}}/*** 判断是否输入quit* @param input 输入内容* @return true代表结束,false代表不结束*/private static boolean isQuit(String input){if(input == null){return false;}else{if("quit".equalsIgnoreCase(input)){return true;}else{return false;}}}/*** 校验输入* @param input 用户输入内容* @return true代表输入符合要求,false代表不符合*/private static boolean checkInput(String input){if(input == null){return false;}try{int n = Integer.parseInt(input);if(n >= 2){return true;}else{return false;}}catch(Exception e){return false; //输入不是整数}}/*** 向服务器端发送数据* @param data 数据内容*/private static void send(byte[] data){try{os.write(data);}catch(Exception e){}}/*** 接收服务器端反馈* @return 反馈数据*/private static byte[] receive(){byte[] b = new byte[1024];try {int n = is.read(b);byte[] data = new byte[n];//复制有效数据System.arraycopy(b, 0, data, 0, n);return data;} catch (Exception e){}return null;}/*** 解析协议数据* @param data 协议数据*/private static void parse(byte[] data){if(data == null){System.out.println("服务器端反馈数据不正确!");return;}byte value = data[0]; //取第一个byte//按照协议格式解析switch(value){case 0:System.out.println("质数");break;case 1:System.out.println("不是质数");break;case 2:System.out.println("协议格式错误");break;}}/*** 关闭流和连接*/private static void close(){try{br.close();is.close();os.close();socket.close();}catch(Exception e){e.printStackTrace();}}
}

在该代码中,将程序的功能使用方法进行组织,使得结构比较清晰,核心的逻辑流程在main方法中实现。

以TCP方式实现的服务器端的代码如下:

package example1;
import java.net.*;
/*** 以TCP方式实现的质数判别服务器端*/
public class TCPPrimeServer {public static void main(String[] args) {final int PORT = 10005;ServerSocket ss = null;try {ss = new ServerSocket(PORT);System.out.println("服务器端已启动:");while(true){Socket s = ss.accept();new PrimeLogicThread(s);}} catch (Exception e) {}finally{try {ss.close();} catch (Exception e2) {}}}
}
package example1;
import java.io.*;
import java.net.*;
/*** 实现质数判别逻辑的线程*/
public class PrimeLogicThread extends Thread {Socket socket;InputStream is;OutputStream os;public PrimeLogicThread(Socket socket){this.socket = socket;init();start();}/*** 初始化*/private void init(){try{is = socket.getInputStream();os = socket.getOutputStream();}catch(Exception e){}}public void run(){while(true){//接收客户端反馈byte[] data = receive();//判断是否是退出if(isQuit(data)){break; //结束循环}//逻辑处理byte[] b = logic(data);//反馈数据send(b);}close();}/*** 接收客户端数据* @return 客户端发送的数据*/private byte[] receive(){byte[] b = new byte[1024];try {int n = is.read(b);byte[] data = new byte[n];//复制有效数据System.arraycopy(b, 0, data, 0, n);return data;} catch (Exception e){}return null;}/*** 向客户端发送数据* @param data 数据内容*/private void send(byte[] data){try{os.write(data);}catch(Exception e){}}/*** 判断是否是quit* @return 是返回true,否则返回false*/private boolean isQuit(byte[] data){if(data == null){return false;}else{String s = new String(data);if(s.equalsIgnoreCase("quit")){return true;}else{return false;}}}private byte[] logic(byte[] data){//反馈数组byte[] b = new byte[1];//校验参数if(data == null){b[0] = 2;return b;}try{//转换为数字String s = new String(data);int n = Integer.parseInt(s);//判断是否是质数if(n >= 2){boolean flag = isPrime(n);if(flag){b[0] = 0;}else{b[0] = 1;}}else{b[0] = 2; //格式错误System.out.println(n);}}catch(Exception e){e.printStackTrace();b[0] = 2;}return b;}/**** @param n* @return*/private boolean isPrime(int n){boolean b = true;for(int i = 2;i <= Math.sqrt(n);i++){if(n % i == 0){b = false;break;}}return b;}/*** 关闭连接*/private void close(){try {is.close();os.close();socket.close();} catch (Exception e){}}
}

本示例使用的服务器端的结构和前面示例中的结构一致,只是逻辑线程的实现相对来说要复杂一些,在线程类中的logic方法中实现了服务器端逻辑,根据客户端发送过来的数据,判断是否是质数,然后根据判断结果按照协议格式要求,生成客户端反馈数据,实现服务器端要求的功能。

回复以下关键字获取更多学习资源

java基础|html5|css|js|jquery|angularJs|ajax|node.js|javaEE基础| |struts2|hibernate|spring|svn|maven|springmvc|mybatis|linux|oracle| |luncene|solr|redis|springboot|架构师资源|dubbo|php|webservice|c++基础|nginx|mysql|sqlserver|asp.net

更多学习资源逐步更新,请置顶公众号不要错过更新

好好学java

每日推送java优质文章、视频教程、热点资讯

微信ID:SIHAI0911

长按左侧二维码关注

java网络编程(六)相关推荐

  1. 你所需要的java网络编程大总结

    好好学java java知识分享/学习教程免费分享 关注 精彩内容 你所需要的java全套视频教程 你所需要的java电子图书 你所需要的大数据视频教程 你所需要的java练习项目 如 / 梦 上个月 ...

  2. Java 网络编程(超级详细)

    前言:本文是初学Java网络编程时所记录的学习笔记,方便以后查阅学习,同时也作为资料总结分享给大家,如果有问题欢迎指出!! 1. 网络编程 1.1 网络编程基本概念 1.网络 将不同区域的电脑连接到一 ...

  3. Java网络编程笔记

    Java网络编程 14-1 网络编程概述 14-2 网络通信要素概述 14-3 通信要素一:IP和端口号 InetAddress类测试 14-4 通信要素二:网络协议 14-5 TCP网络编程 TCP ...

  4. Java网络编程基础_Java网络编程基础篇

    一.前言 网络通讯在系统交互中是必不可少的一部分,无论是面试还是工作中都是绕不过去的一部分,本节我们来谈谈Java网络编程中的一些知识,本chat内容如下: 网络通讯基础知识,剖析网络通讯的本质和需要 ...

  5. Java 网络编程系列之 NIO

    Java 网络编程系列之 NIO 第 1 章Java NIO 概述 1.1 IO 概述 IO 的操作方式 1.2 阻塞 IO (BIO) 1.3 非阻塞 IO(NIO) 1.4 异步非阻塞 IO(AI ...

  6. Java网络编程(八)—— 组播和MulticastSocket

    Java网络编程(八)-- 组播和MulticastSocket 文章目录 Java网络编程(八)-- 组播和MulticastSocket 什么是组播 MulticastSocket类 总述 构造方 ...

  7. Java 网络编程基础知识

    Java 网络编程基础知识 基础概念 计算机网络的基本概念 ​ 网络:多台计算机使用网络设备互联在一起,计算机之间可以进行通信,这样就组成了一个计算机网络. ​ 网络设备:集线器(HUB),路由器,交 ...

  8. java 密钥工厂 desede_20145212 实验五《Java网络编程》

    20145212 实验五<Java网络编程> 一.实验内容1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成代 ...

  9. Java学习总结:52(Java网络编程)

    Java网络编程 开发第一个网络程序 java.net包提供了网络编程有关的开发工具类,在此包中有一下两个主要的核心操作类. ServerSocket类:是一个封装支持的TCP协议的操作类,主要工作在 ...

  10. Java - 网络编程(NetWork)

    Java - 网络编程(NetWork) 一.java.net包下的 InetAddress 类的使用: > 一个 InetAddress 代表着一个IP地址 > 主要用来查看本机的IP和 ...

最新文章

  1. 践行科技向善,腾讯Light 把光引向厦门
  2. echarts柱状图x轴文字换行_深入 echarts 如何设置 Label / axisLabel 换行及自定义格式 / 自定义样式? 结合 canvas 如何实现文字换行来理解...
  3. sqlserver获取当月、年的第一天和最后一天
  4. 转如何在Sublime Text 2里增加编辑运行java功能
  5. LibreOffice 3.6.6 修复了 50 个 Bug
  6. SqlHelper中IN集合场景下的参数处理
  7. WP7进阶】——XNA游戏平面矩形碰撞检测
  8. MeeGo 1.2发布
  9. 为啥有的程序员不爱说话,却表达能力爆表?(附教程)
  10. 工具 转_微信文章转 PDF 桌面工具
  11. 数据建模-聚类分析-K-Means算法
  12. jQuery实现彩色云标签
  13. 被国人误传了几千年的八句俗语
  14. JavaWeb教程———过滤器
  15. 解决ppt复制到Word的图片导出PDF后出现黑线问题,word转PDF图片不清晰的问题,ppt转矢量图问题
  16. Win7环境下如何开启802.1X 无线网络认证
  17. linux系统的python版本_Linux系统下多版本Python管理
  18. 泰拉瑞亚 1.4 搭建服务器教程
  19. java设计ui界面(用户登录)
  20. 天梯赛 L1-054 福到了 (15 分) C++

热门文章

  1. 刚登录,有点感觉就想写下来
  2. 【网络协议】TCP分段与UDP/IP分片 (MTU最大传输单元,MSS最大分段大小)
  3. stm32F103的systick时间不准终于找到原因了
  4. (chap2 TCP/IP基础知识) TCP/IP协议分层模型-应用层
  5. C++ Primer 5th笔记(chap 15 OOP)构造函数和拷贝控制
  6. BUUCTF firmware
  7. [密码学] Shannon保密系统的信息理论 熵与完美保密性
  8. 7-CPU Reset
  9. 密码学基础(1)-前言
  10. python批量处理jira上的issue