使用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 相关文章推荐
JavaScript confirm选择判断
Oct 18 Javascript
JavaScript 组件之旅(一)分析和设计
Oct 28 Javascript
使用jQuery简单实现模拟浏览器搜索功能
Dec 21 Javascript
浅谈javascript构造函数与实例化对象
Jun 22 Javascript
jquery验证手机号是否正确实例讲解
Nov 17 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
Apr 16 Javascript
vue使用$emit时,父组件无法监听到子组件的事件实例
Feb 26 Javascript
完美解决iview 的select下拉框选项错位的问题
Mar 02 Javascript
JavaScript实现连连看连线算法
Jan 05 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
Jan 18 jQuery
防止Layui form表单重复提交的实现方法
Sep 10 Javascript
Preload基础使用方法详解
Feb 03 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 和 HTML
2006/10/09 PHP
1.PHP简介
2006/10/09 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
PHP设计模式之装饰者模式代码实例
2015/05/11 PHP
php操作路径的经典方法(必看篇)
2016/10/04 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
学习ExtJS Window常用方法
2009/10/07 Javascript
利用JS进行图片的切换即特效展示图片
2013/12/03 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
Javascript刷新窗口方法小结
2015/10/21 Javascript
jQuery实现摸拟alert提示框
2016/05/22 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
jquery判断页面网址是否有效的两种方法
2016/12/11 Javascript
js中删除数组中的某一元素实例(无下标时)
2017/02/28 Javascript
JS实现队列的先进先出功能示例
2017/05/10 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
js布局实现单选按钮控件
2020/01/17 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
Python中的pass语句使用方法讲解
2015/05/14 Python
python对象及面向对象技术详解
2016/07/19 Python
Python利用递归和walk()遍历目录文件的方法示例
2017/07/14 Python
详解Python进程间通信之命名管道
2017/08/28 Python
python中如何使用正则表达式的非贪婪模式示例
2017/10/09 Python
Python进阶学习之特殊方法实例详析
2017/12/01 Python
Python标准库笔记struct模块的使用
2018/02/22 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
pytorch 准备、训练和测试自己的图片数据的方法
2020/01/10 Python
python中如何设置代码自动提示
2020/07/15 Python
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
教育系毕业生中文求职信范文
2013/10/06 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
护士求职自荐信
2015/03/25 职场文书