使用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 相关文章推荐
获取DOM对象的几种扩展及简写
Oct 09 Javascript
jQuery使用手册之 事件处理
Mar 24 Javascript
jQuery学习4 浏览器的事件模型
Feb 07 Javascript
JavaScript打开word文档的实现代码(c#)
Apr 16 Javascript
只需一行代码,轻松实现一个在线编辑器
Nov 12 Javascript
javascript中为某个元素指定事件的三种方式
Aug 07 Javascript
jQuery中:last选择器用法实例
Dec 30 Javascript
在线引用最新jquery文件的实现方法
Aug 26 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
Feb 16 Javascript
干货!教大家如何选择Vue和React
Mar 13 Javascript
通过扫小程序码实现网站登陆功能
Aug 22 Javascript
vue父子模板传值问题解决方法案例分析
Feb 26 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
PHP5+UTF8多文件上传类
2008/10/17 PHP
PHP的可变变量名的使用方法分享
2012/02/05 PHP
php中防止恶意刷新页面的代码小结
2012/10/31 PHP
Smarty局部缓存的几种方法简介
2014/06/17 PHP
php数组索引的Key加引号和不加引号的区别
2014/08/19 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
2016/04/01 PHP
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
解决Jquery鼠标经过不停滑动的问题
2014/03/03 Javascript
jquery做的一个简单的屏幕锁定提示框
2014/03/26 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
Javascript类型系统之undefined和null浅析
2016/07/13 Javascript
微信小程序 弹框和模态框实现代码
2017/03/10 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
vue实现简单计算商品价格
2020/09/14 Javascript
python中使用enumerate函数遍历元素实例
2014/06/16 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
美国领先的户外服装与装备用品店:Moosejaw
2016/08/25 全球购物
MAC彩妆英国官网:M·A·C UK
2018/05/30 全球购物
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
更夫岗位责任制
2014/02/11 职场文书
房屋转让协议书
2014/04/11 职场文书
商场客服专员岗位职责
2014/06/13 职场文书
个人总结与自我评价
2014/09/18 职场文书
公司授权委托书
2014/10/17 职场文书
小学教育见习报告
2014/10/31 职场文书
数学教师个人工作总结
2015/02/06 职场文书
党校个人总结
2015/03/04 职场文书
北大自主招生自荐信
2015/03/04 职场文书
麦田里的守望者读书笔记
2015/06/30 职场文书
2015小学师德工作总结
2015/07/21 职场文书
演讲稿之我的初心我的成长
2019/08/12 职场文书
DIV CSS实现网页背景半透明效果
2021/12/06 HTML / CSS
Android基于Fresco实现圆角和圆形图片
2022/04/01 Java/Android
Python使用DFA算法过滤内容敏感词
2022/04/22 Python
Win11如何查看显卡型号 Win11查看显卡型号的方法
2022/08/14 数码科技