- 浏览: 130427 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
20082233:
你能详细解释下代码的意思吗?谢谢
js时间日期格式化 -
zhoche2008:
好文章,解决了我的问题
swt执行线程 -
hanyafei:
朋友,你那第二个选择之后出错,你那是正确的吗?
JSP+AJAX三级级联及更多级的实现 -
EdenWang:
哥们,这能显示么?
strut2异常问题的解决 -
JavaLanguageFun:
标记一下 ,这个不错。
eclipse插件大全介绍,以及下载地址(转)
陈跃峰
出自:http://blog.csdn.net/mailbomb
13.3 网络编程示例
“实践出真知”,所以在进行技术学习时,还是需要进行很多的练习,才可以体会技术的奥妙,下面通过两个简单的示例,演示网络编程的实际使用。
13.3.1质数判别示例
该示例实现的功能是质数判断,程序实现的功能为客户端程序接收用户输入的数字,然后将用户输入的内容发送给服务器端,服务器端判断客户端发送的数字是否是质数,并将判断的结果反馈给客户端,客户端根据服务器端的反馈显示判断结果。
质数的规则是:最小的质数是2,只能被1和自身整除的自然数。当用户输入小于2的数字,以及输入的内容不是自然数时,都属于非法输入。
网络程序的功能都分为客户端程序和服务器端程序实现,下面先描述一下每个程序分别实现的功能:
1、 客户端程序功能:
a) 接收用户控制台输入
b) 判断输入内容是否合法
c) 按照协议格式生成发送数据
d) 发送数据
e) 接收服务器端反馈
f) 解析服务器端反馈信息,并输出
2、 服务器端程序功能:
a) 接收客户端发送数据
b) 按照协议格式解析数据
c) 判断数字是否是质数
d) 根据判断结果,生成协议数据
e) 将数据反馈给客户端
分解好了网络程序的功能以后,就可以设计网络协议格式了,如果该程序的功能比较简单,所以设计出的协议格式也不复杂。
客户端发送协议格式:
将用户输入的数字转换为字符串,再将字符串转换为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方法中实现了服务器端逻辑,根据客户端发送过来的数据,判断是否是质数,然后根据判断结果按照协议格式要求,生成客户端反馈数据,实现服务器端要求的功能。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Mailbomb/archive/2009/06/17/4277293.aspx
发表评论
-
浅复制与深复制概念
2010-09-28 11:00 7391.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变 ... -
Java基础:Java开发中的23种设计模式
2009-10-26 10:07 5741、工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品, ... -
java中120个经典问题(1)
2009-10-26 10:03 7381.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便 ... -
EXE4J
2009-10-17 16:49 1936进入exe4j的网站 http://www ... -
Clone 方法的使用(深度克隆)
2009-10-16 09:14 731转载自:http://www.java2000.net/p12 ... -
MANIFEST.MF 文件内容详解
2009-10-15 19:21 726MANIFEST.MF 文件内容详解 打开 ... -
一段最简单的生成不重复随机数的程序
2009-10-15 18:44 930转载:http://www.java2000.net/p711 ... -
java 获取当前路径方法
2009-10-15 16:45 2108import java.io.File; /** * ... -
Java做的注册模块
2009-10-10 14:29 862转载自:http://blog.csdn.net/baohui ... -
java操作注册表
2009-10-10 14:26 807/** *@Author *@Date Oct 10, 2 ... -
使用J2SE API读取Properties文件的六种方法
2009-05-23 12:26 840转载自:http://www.java2000.net/p85 ... -
Java IO处理类的汇总
2009-05-21 22:41 745http://www.java2000.net/p1225 ... -
Java对象的序列化和反序列化
2009-05-20 23:43 702转载:http://www.java2000.net/p134 ... -
java写文件方法之比较
2009-05-20 23:37 1641import java.io.BufferedOutputSt ... -
Java图像传输方法
2009-05-18 12:07 3126在研发B/S视频系统时候涉及到了图片在网络中的传输,研究了一些 ... -
算术运算符部分=晋升
2009-05-15 23:17 746在算术运算符部分,需要特别注意的一个语法现象是“晋升”。晋升指 ... -
JDK1.5新特性
2009-05-09 21:32 873今天浏览了jdk1.5的新特性: 泛型: public c ... -
编写Java动态代理的步骤
2009-05-08 17:29 919编写Java动态代理的步骤如下: 1.创建一个实现接口 ... -
每个初学者都应该搞懂的几个问题?
2009-05-07 19:56 587转载自:http://flustar.itey ... -
eclipse插件大全介绍,以及下载地址(转)
2009-02-24 17:22 3284好东西先放好先^_^ Eclipse及其插 ...
相关推荐
在Java编程中,控制执行是程序流程的基础,主要包括条件语句和循环语句。本讲主要探讨了如何使用这些结构来实现程序的逻辑控制。 首先,条件语句以`if`关键字开始,它允许我们根据特定条件执行代码块。在Java中,`...
这本书《Java 3D编程实践——网络上的三维动画》显然会深入探讨如何利用Java 3D来实现网络环境中的动态3D场景。 Java 3D API是基于Java Foundation Classes (JFC) 的一部分,它为开发者提供了构建三维图形应用的...
【标题】"HNU编程新技术实务实验一——Java语言编程"揭示了这是一份与Java编程相关的学习资源,特别关注于湖南大学(HNU)的编程新技术实务课程中的实验项目。这个实验可能涵盖基础到进阶的Java编程概念,旨在帮助...
首先,我们要理解Java在网络编程中的基础——IO流。Java中的IO流分为字节流和字符流,它们用于读写数据,包括网络上的数据传输。在Java中,Socket类和ServerSocket类是网络编程的核心,它们分别代表客户端和服务器端...
Java Socket网络编程是Java平台中实现网络通信的核心技术,它基于传输层协议TCP和UDP,为应用程序提供了低级别的、原始的比特流服务。本基础示例将深入探讨这两种协议下的Socket编程。 首先,TCP(Transmission ...
Java编程语言是面向对象的、跨平台的编程语言,由Sun Microsystems公司于1995年推出,目前广泛应用于各种领域,如Web开发、移动应用、企业级应用、大数据处理等。"Java编程200例(附:JAVA文档完全解读中文版)"是一...
Java作为一种跨平台的编程语言,其强大的网络支持和面向对象特性使其成为工业自动化领域中与PLC通信的理想选择。通过Java,开发者可以在不同的操作系统上编写和运行代码,与PLC设备进行数据交换。 西门子PLC是工业...
"趣味编程C语言——C语言经典示例代码"这个资源旨在通过一系列实例来帮助初学者和有经验的开发者深入理解C语言的核心概念。下面,我们将详细探讨其中可能涉及的知识点。 1. **基础语法**:C语言的基础包括变量声明...
这篇博客“JNI编程(二) —— 让C++和Java相互调用(2)”显然深入探讨了如何利用JNI实现Java与C++之间的互调用。在Java应用程序中,有时为了性能优化或者利用已有的C/C++库,我们需要借助JNI来实现这种跨语言的通信。 ...
学习过程中,通过阅读《Java网络编程学习资料》这本书,你可以了解到如何创建简单的服务器和客户端示例,理解Socket通信的过程,以及如何利用JTA进行分布式事务管理。书中可能还包含了一些实用的代码示例和最佳实践...
PHP实例开发源码——PHP 验证通 示例
《Java语言程序设计——基础篇》是Java语言的经典教材,中文版...《Java语言程序设计——基础篇》以示例讲解解决问题的技巧,提供大量的程序清单和相应的提示,每章配有大量复习题和编程练习题,帮助读者掌握编程技术
《Java语言程序设计——基础篇》是Java语言的经典教材,中文版...《Java语言程序设计——基础篇》以示例讲解解决问题的技巧,提供大量的程序清单和相应的提示,每章配有大量复习题和编程练习题,帮助读者掌握编程技术。
安卓Android源码——OPENG开发的示例代码.zip
在"斯凯MRP源码——简单UI绘制示例"这个主题中,我们将主要探讨如何使用斯凯MRP的开发工具进行用户界面(UI)的绘制,特别是如何实现渐变矩形的填充。 首先,我们需要了解在MRP系统中,UI的设计是至关重要的,因为...
通过阅读《Java编程那些事儿》并结合代码示例,初学者可以动手编写简单的程序,逐步建立起对Java语言的理解。同时,熟悉软件下载和安装的过程也是提升技能的重要步骤,因为这将帮助他们更好地搭建和管理开发环境。 ...
《Java语言程序设计——基础篇》是Java语言的经典教材,中文版...《Java语言程序设计——基础篇》以示例讲解解决问题的技巧,提供大量的程序清单和相应的提示,每章配有大量复习题和编程练习题,帮助读者掌握编程技术。
Java编程示例是一个集合,包含了100个不同的Java编程实例,旨在帮助初学者和有经验的开发者加深对Java语言的理解。这些示例涵盖了Java语言的基础到进阶特性,是学习和实践Java编程的重要资源。 在Java编程的世界里...