使用Java实现简单的server/client回显功能的方法介绍


Posted in Javascript onMay 03, 2013

Socket是指在一个特定编程模型下,进程间通信链路的端点。因为这个特定编程模型的流行,Socket这个名字在其他领域得到了复用,包括Java叫技术。

如果要建立连接,一台机器必须运行一个进程来等待连接,而另一台机器必须试图到达第一台机器。这个电话系统类似:一方必须发起呼叫,而另一方在此时必须等待电话呼叫。

java网络模型图

使用Java实现简单的server/client回显功能的方法介绍

下面通过一个有“回显”功能的服务器和客户端来介绍应用java.net包编写网络应用程序。

 

这个例子主要功能是服务器端的程序等待客户的输入,然后将读取到的信息回显给客户端,同时在服务器端的控制台输出。而客户端从控制台接收信息后,向客户端发送输入,并接收服务器的回显数据,然后显示在控制台。

客户端程序代码如下:

package com.javapp.ch11;
 import java.io.*;
 import java.net.*;
 /**
 * Description: 具有“回显”功能的服务器端和客户端程序
 */
 public class EchoClientDemo {
     // 服务器端的服务端口。
     public static final int SERVERPORT = 990;
     public static void main(String[] args) {
         try {
             // 建立连接套接字。
             Socket s = new Socket("localhost",SERVERPORT);
             System.out.println("socket = " + s);
             // 新建网络连接的输入流。
             BufferedReader in = new BufferedReader(new InputStreamReader(s
                     .getInputStream()));
             // 新建网络连接的自动刷新的输出流。
             PrintWriter out = new PrintWriter(new BufferedWriter(
                     new OutputStreamWriter(s.getOutputStream())),true);
             // 先使用System.in构造InputStreamReader,再构造BufferedReader。
             BufferedReader stdin = new BufferedReader(
                     new InputStreamReader(System.in));
             System.out.println("Enter a string, Enter BYE to exit! ");
             while (true) {
                 // 读取从控制台输入的字符串,并向网络连接输出,即向服务器端发送数据。
                 out.println(stdin.readLine());
                 // 从网络连接读取一行,即接收服务器端的数据。
                 String str = in.readLine();
         // 如果接收到的数据为空(如果直接按Enter,不是空数据),则退出循环,关闭连接。
                 if (str == null) {
                     break;
                 }
                 System.out.println(str);
             }
             s.close();
         } catch (IOException e) {
             System.err.println("IOException" + e.getMessage());
         }
     }
 }

上面客户端程序中。首先用java.net包中的Socket类建立一个连接套接字,其后应用的Socket对象的getInputStream方法从服务器接收数据,并且应用Socket对象的getOuputStream方法发送数据到服务器。创建完输入输出流,就可以像读写文件的方式来读写数据。

支持多客户端的“回显”服务器端程序代码如下:

package com.javapp.ch11;
 import java.io.*;
 import java.net.*;
 /**
 * Description:支持多客户端的“回显”服务器端程序
 */
 public class EchoServerThreadDemo {
     // 服务器端的服务端口。
     public static final int SERVERPORT = 990;
     public static void main(String[] args) {
         try {
             // 已经连接上的客户端的序号。
             int number = 1;
             // 建立服务器端倾听套接字。
             ServerSocket s = new ServerSocket(SERVERPORT);
             System.out.println("Started: " + s);
             while (true) {
                 // 等待并接收请求,建立连接套接字。
                 Socket incoming = s.accept();
                 System.out.println("Connection " + number + " accepted: ");
                 System.out.println(incoming);
                 // 启动一个线程来进行服务器端和客户端的数据传输。
                 // 主程序继续监听是否有请求到来。
                 Thread t = new EchoThread(incoming,number);
                 t.start();
                 number++;
             }
         } catch (IOException e) {
             System.err.println("IOException");
         }
     }
 }
 class EchoThread extends Thread {
     private Socket s;
     int n;
     public EchoThread(Socket incoming,int number) {
         s = incoming;
         n = number;
     }
     public void run() {
         try {
             // 新建网络连接的输入流。
             BufferedReader in = new BufferedReader(new InputStreamReader(s
                     .getInputStream()));
             // 新建网络连接的自动刷新的输出流。
             PrintWriter out = new PrintWriter(new BufferedWriter(
                     new OutputStreamWriter(s.getOutputStream())),true);
             System.out.println("Hello! Enter BYE to exit.");
             // 回显客户端的输入。
             while (true) {
                 // 从网络连接读取一行,即接收客户端的数据。
                 String line = in.readLine();
         // 如果接收到的数据为空(如果直接按Enter,不是空数据),则退出循环,关闭连接。
                 if (line == null) {
                     break;
                 } else {
                     if (line.trim().equals("BYE")) {
                         System.out.println("The client " + n + " entered BYE!");
                         System.out.println("Connection " + n + " will be closed!");
                         break;
                     }
                     System.out.println("Echo " + n + ": " + line);
                     // 向网络连接输出一行,即向客户端发送数据。
                     out.println("Echo " + n + ": " + line);
                 }
             }
             // 关闭套接字。
             s.close();
         } catch (IOException e) {
             System.err.println("IOException");
         }
     }
 }

在服务器端程序中,首先用java.net包中的ServerSocket类创建一个服务器端侦听套接字。其后应用ServerSocket类的accept方法等待并接收用户请求。当服务器每接收到一个连接请求后,就启动一个线程来单独处理服务器和客户端的数据传输。服务器端数据的接收和发送与上面介绍的客户端数据的发送和介绍相同。
Javascript 相关文章推荐
jquery使用append(content)方法注意事项分享
Jan 06 Javascript
JavaScript中switch判断容易犯错的一个细节
Aug 27 Javascript
jQuery的ready方法详解
Nov 27 Javascript
JavaScript实现带标题的图片轮播特效
May 20 Javascript
JS实现简单的右下角弹出提示窗口完整实例
Jun 21 Javascript
JavaScript仿百度图片浏览效果
Nov 23 Javascript
使用vue-cli导入Element UI组件的方法
May 16 Javascript
vue项目环境变量配置的实现方法
Oct 12 Javascript
微信小程序自定义toast的实现代码
Nov 16 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
Nov 28 Javascript
如何将百度地图包装成Vue的组件的方法步骤
Feb 12 Javascript
详解javascript设计模式三:代理模式
Mar 25 Javascript
用原生JavaScript实现jQuery的$.getJSON的解决方法
May 03 #Javascript
基于KMP算法JavaScript的实现方法分析
May 03 #Javascript
JS动态获取当前时间,并写到特定的区域
May 03 #Javascript
JS实现商品倒计时实现代码
May 03 #Javascript
Javascript代码在页面加载时的执行顺序介绍
May 03 #Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
May 03 #Javascript
javascript两种function的定义介绍及区别说明
May 02 #Javascript
You might like
php 文本文件的读取效率
2012/02/10 PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
2013/06/03 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
php安装ssh2扩展的方法【Linux平台】
2016/07/20 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
javascript:以前写的xmlhttp池,代码
2008/05/18 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
tangram框架响应式加载图片方法
2013/11/21 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
jquery实现表单验证并阻止非法提交
2015/07/09 Javascript
基于jQuery实现在线选座之高铁版
2015/08/24 Javascript
纯js代码实现简单计算器
2015/12/02 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
react router4+redux实现路由权限控制的方法
2018/05/03 Javascript
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
2018/05/18 Javascript
如何使用RoughViz可视化Vue.js中的草绘图表
2021/01/30 Vue.js
python实现报表自动化详解
2017/11/16 Python
关于Tensorflow中的tf.train.batch函数的使用
2018/04/24 Python
基于python进行抽样分布描述及实践详解
2019/09/02 Python
Django框架教程之中间件MiddleWare浅析
2019/12/29 Python
基于python实现对文件进行切分行
2020/04/26 Python
英国最大的手表网站:The Watch Hut
2017/03/31 全球购物
英国索普公园票务和酒店套餐:Thorpe Breaks
2019/09/14 全球购物
介绍下java.util.Arrays类
2012/10/16 面试题
哈弗商学院毕业生求职信
2014/02/26 职场文书
竞选班干部演讲稿100字
2014/08/20 职场文书
计划生育证明格式范本
2014/09/12 职场文书
司机岗位职责
2015/02/04 职场文书
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS