Java编程那些事儿103——网络编程技术2

陈跃峰

出自:http://blog.csdn.net/mailbomb

13.2.3 TCP编程

按照前面的介绍,网络通讯的方式有TCP和UDP两种,其中TCP方式的网络通讯是指在通讯的过程中保持连接,有点类似于打电话,只需要拨打一次号码(建立一次网络连接),就可以多次通话(多次传输数据)。这样方式在实际的网络编程中,由于传输可靠,类似于打电话,如果甲给乙打电话,乙说没有听清楚让甲重复一遍,直到乙听清楚为止,实际的网络传输也是这样,如果发送的一方发送的数据接收方觉得有问题,则网络底层会自动要求发送方重发,直到接收方收到为止。

在Java语言中,对于TCP方式的网络编程提供了良好的支持,在实际实现时,以java.net.Socket类代表客户端连接,以java.net.ServerSocket类代表服务器端连接。在进行网络编程时,底层网络通讯的细节已经实现了比较高的封装,所以在程序员实际编程时,只需要指定IP地址和端口号码就可以建立连接了。正是由于这种高度的封装,一方面简化了Java语言网络编程的难度,另外也使得使用Java语言进行网络编程时无法深入到网络的底层,所以使用Java语言进行网络底层系统编程很困难,具体点说,Java语言无法实现底层的网络嗅探以及获得IP包结构等信息。但是由于Java语言的网络编程比较简单,所以还是获得了广泛的使用。

在使用TCP方式进行网络编程时,需要按照前面介绍的网络编程的步骤进行,下面分别介绍一下在Java语言中客户端和服务器端的实现步骤。

在客户端网络编程中,首先需要建立连接,在Java API中以java.net.Socket类的对象代表网络连接,所以建立客户端网络连接,也就是创建Socket类型的对象,该对象代表网络连接,示例如下:

Socket socket1 = new Socket(“192.168.1.103”,10000);

Socket socket2 = new Socket(“www.sohu.com”,80);

上面的代码中,socket1实现的是连接到IP地址是192.168.1.103的计算机的10000号端口,而socket2实现的是连接到域名是www.sohu.com的计算机的80号端口,至于底层网络如何实现建立连接,对于程序员来说是完全透明的。如果建立连接时,本机网络不通,或服务器端程序未开启,则会抛出异常。

连接一旦建立,则完成了客户端编程的第一步,紧接着的步骤就是按照“请求-响应”模型进行网络数据交换,在Java语言中,数据传输功能由Java IO实现,也就是说只需要从连接中获得输入流和输出流即可,然后将需要发送的数据写入连接对象的输出流中,在发送完成以后从输入流中读取数据即可。示例代码如下:

OutputStream os = socket1.getOutputStream();  //获得输出流

InputStream is = socket1.getInputStream();     //获得输入流

上面的代码中,分别从socket1这个连接对象获得了输出流和输入流对象,在整个网络编程中,后续的数据交换就变成了IO操作,也就是遵循“请求-响应”模型的规定,先向输出流中写入数据,这些数据会被系统发送出去,然后在从输入流中读取服务器端的反馈信息,这样就完成了一次数据交换过程,当然这个数据交换过程可以多次进行。

这里获得的只是最基本的输出流和输入流对象,还可以根据前面学习到的IO知识,使用流的嵌套将这些获得到的基本流对象转换成需要的装饰流对象,从而方便数据的操作。

最后当数据交换完成以后,关闭网络连接,释放网络连接占用的系统端口和内存等资源,完成网络操作,示例代码如下:

socket1.close();

这就是最基本的网络编程功能介绍。下面是一个简单的网络客户端程序示例,该程序的作用是向服务器端发送一个字符串“Hello”,并将服务器端的反馈显示到控制台,数据交换只进行一次,当数据交换进行完成以后关闭网络连接,程序结束。实现的代码如下:

package tcp;

import java.io.*;

import java.net.*;

/**

* 简单的Socket客户端

* 功能为:发送字符串“Hello”到服务器端,并打印出服务器端的反馈

*/

public class SimpleSocketClient {

public static void main(String[] args) {

Socket socket = null;

InputStream is = null;

OutputStream os = null;

//服务器端IP地址

String serverIP = "127.0.0.1";

//服务器端端口号

int port = 10000;

//发送内容

String data = "Hello";

try {

//建立连接

socket = new Socket(serverIP,port);

//发送数据

os = socket.getOutputStream();

os.write(data.getBytes());

//接收数据

is = socket.getInputStream();

byte[] b = new byte[1024];

int n = is.read(b);

//输出反馈数据

System.out.println("服务器反馈:" + new String(b,0,n));

} catch (Exception e) {

e.printStackTrace(); //打印异常信息

}finally{

try {

//关闭流和连接

is.close();

os.close();

socket.close();

} catch (Exception e2) {}

}

}

}

在该示例代码中建立了一个连接到IP地址为127.0.0.1,端口号码为10000的TCP类型的网络连接,然后获得连接的输出流对象,将需要发送的字符串“Hello”转换为byte数组写入到输出流中,由系统自动完成将输出流中的数据发送出去,如果需要强制发送,可以调用输出流对象中的flush方法实现。在数据发送出去以后,从连接对象的输入流中读取服务器端的反馈信息,读取时可以使用IO中的各种读取方法进行读取,这里使用最简单的方法进行读取,从输入流中读取到的内容就是服务器端的反馈,并将读取到的内容在客户端的控制台进行输出,最后依次关闭打开的流对象和网络连接对象。

这是一个简单的功能示例,在该示例中演示了TCP类型的网络客户端基本方法的使用,该代码只起演示目的,还无法达到实用的级别。

如果需要在控制台下面编译和运行该代码,需要首先在控制台下切换到源代码所在的目录,然后依次输入编译和运行命令:

javac –d . SimpleSocketClient.java

java tcp.SimpleSocketClient

和下面将要介绍的SimpleSocketServer服务器端组合运行时,程序的输出结果为:

服务器反馈:Hello

介绍完一个简单的客户端编程的示例,下面接着介绍一下TCP类型的服务器端的编写。首先需要说明的是,客户端的步骤和服务器端的编写步骤不同,所以在学习服务器端编程时注意不要和客户端混淆起来。

在服务器端程序编程中,由于服务器端实现的是被动等待连接,所以服务器端编程的第一个步骤是监听端口,也就是监听是否有客户端连接到达。实现服务器端监听的代码为:

ServerSocket ss = new ServerSocket(10000);

该代码实现的功能是监听当前计算机的10000号端口,如果在执行该代码时,10000号端口已经被别的程序占用,那么将抛出异常。否则将实现监听。

服务器端编程的第二个步骤是获得连接。该步骤的作用是当有客户端连接到达时,建立一个和客户端连接对应的Socket连接对象,从而释放客户端连接对于服务器端端口的占用。实现功能就像公司的前台一样,当一个客户到达公司时,会告诉前台我找某某某,然后前台就通知某某某,然后就可以继续接待其它客户了。通过获得连接,使得客户端的连接在服务器端获得了保持,另外使得服务器端的端口释放出来,可以继续等待其它的客户端连接。实现获得连接的代码是:

Socket socket = ss.accept();

该代码实现的功能是获得当前连接到服务器端的客户端连接。需要说明的是accept和前面IO部分介绍的read方法一样,都是一个阻塞方法,也就是当无连接时,该方法将阻塞程序的执行,直到连接到达时才执行该行代码。另外获得的连接会在服务器端的该端口注册,这样以后就可以通过在服务器端的注册信息直接通信,而注册以后服务器端的端口就被释放出来,又可以继续接受其它的连接了。

连接获得以后,后续的编程就和客户端的网络编程类似了,这里获得的Socket类型的连接就和客户端的网络连接一样了,只是服务器端需要首先读取发送过来的数据,然后进行逻辑处理以后再发送给客户端,也就是交换数据的顺序和客户端交换数据的步骤刚好相反。这部分的内容和客户端很类似,所以就不重复了,如果还不熟悉,可以参看下面的示例代码。

最后,在服务器端通信完成以后,关闭服务器端连接。实现的代码为:

ss.close();

这就是基本的TCP类型的服务器端编程步骤。下面以一个简单的echo服务实现为例子,介绍综合使用示例。echo的意思就是“回声”,echo服务器端实现的功能就是将客户端发送的内容再原封不动的反馈给客户端。实现的代码如下:

package tcp;

import java.io.*;

import java.net.*;

/**

* echo服务器

* 功能:将客户端发送的内容反馈给客户端

*/

public class SimpleSocketServer {

public static void main(String[] args) {

ServerSocket serverSocket = null;

Socket socket = null;

OutputStream os = null;

InputStream is = null;

//监听端口号

int port = 10000;

try {

//建立连接

serverSocket = new ServerSocket(port);

//获得连接

socket = serverSocket.accept();

//接收客户端发送内容

is = socket.getInputStream();

byte[] b = new byte[1024];

int n = is.read(b);

//输出

System.out.println("客户端发送内容为:" + new String(b,0,n));

//向客户端发送反馈内容

os = socket.getOutputStream();

os.write(b, 0, n);

} catch (Exception e) {

e.printStackTrace();

}finally{

try{

//关闭流和连接

os.close();

is.close();

socket.close();

serverSocket.close();

}catch(Exception e){}

}

}

}

在该示例代码中建立了一个监听当前计算机10000号端口的服务器端Socket连接,然后获得客户端发送过来的连接,如果有连接到达时,读取连接中发送过来的内容,并将发送的内容在控制台进行输出,输出完成以后将客户端发送的内容再反馈给客户端。最后关闭流和连接对象,结束程序。

在控制台下面编译和运行该程序的命令和客户端部分的类似。

这样,就以一个很简单的示例演示了TCP类型的网络编程在Java语言中的基本实现,这个示例只是演示了网络编程的基本步骤以及各个功能方法的基本使用,只是为网络编程打下了一个基础,下面将就几个问题来深入介绍网络编程深层次的一些知识。

Java编程那些事儿103——网络编程技术2相关推荐

  1. Java编程那些事儿102——网络编程技术1

    Java编程那些事儿102--网络编程技术1 陈跃峰 出自:http://blog.csdn.net/mailbomb 13.2 网络编程技术 前面介绍了网络编程的相关基础知识,初步建立了网络编程的概 ...

  2. Java编程那些事儿104——网络编程技术3

    Java编程那些事儿104--网络编程技术3 陈跃峰 出自:http://blog.csdn.net/mailbomb 为了一步一步的掌握网络编程,下面再研究网络编程中的两个基本问题,通过解决这两个问 ...

  3. Java核心类库篇8——网络编程

    Java核心类库篇8--网络编程 1.七层网络模型 OSI(Open System Interconnect),即开放式系统互联,是ISO(国际标准化组织)组织在1985 年研究的网络互连模型. 当发 ...

  4. java小球碰撞实验报告_20155317 《Java程序设计》实验五网络编程与安全实验报告...

    20155317 <Java程序设计>实验五网络编程与安全实验报告 遇到问题 在刚开始启动客户端或者服务端时,出现了一系列的错误情况,总是提示异常信息 后来经过询问同学,反应将端口号修改一 ...

  5. java自动化测试语言高级之网络编程

    java自动化测试语言高级之网络编程 文章目录 java自动化测试语言高级之网络编程 Java 网络编程 Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来 ...

  6. Java核心类库之(网络编程:网络编程入门、UDP通信程序、TCP通信程序)

    目录 1 网络编程入门 1.1 网络编程概述 1.2 网络编程三要素 1.3 IP地址 1.4 InetAddress的使用 1.5 端口 1.6 协议 2 UDP通信程序 2.1 UDP通信原理 2 ...

  7. Java基础学习笔记之网络编程

    Java基础之网络编程 1.网络编程概述 什么是网络编程 指的是在多个设备(计算机)执行,其中的设备使用一个网络中的所有连接到对方编写程序 网络编程的目的 与其他计算机进行通信 网络编程的问题 1.如 ...

  8. Java的IO模型基于网络编程利弊分析

    JAVA的IO模型基于网络编程利弊分析 一.IO通俗理解 IO的过程 思考①答案:文件句柄 思考②答案: 阻塞/非阻塞 IO(程序对内核空间数据拷贝到用户空间阶段的耗时操作的等待方式) 同步/异步IO ...

  9. 陈硕《网络编程实战》01 网络编程概要

    陈硕<网络编程实战> 01 网络编程概要 站在巨人的肩膀之上. 按照录像整理,部分专有名词不太肯定,版权归陈硕大神. 大家好,我是陈硕,受邀讲授一门有关网络编程的在线课程,这门课程的名称是 ...

最新文章

  1. 安装关联vs2008的opencv
  2. PL/SQL developer export/import (转)
  3. FastDFS配置nginx插件访问图片
  4. 百练OJ:3681与2796:数字求和
  5. nuxt.js 本地开发跨域问题(Access-Control-Allow-Origin)及其解决方案
  6. jvm中的年轻代 老年代 持久代 gc ----------转载
  7. 数学思维比数学运算更重要
  8. Linux无线网络设置(wpa_supplicant的使用)
  9. Java 字符串拼接的各种玩法
  10. 【Python3网络爬虫开发实战】 1.5.4-RedisDump的安装
  11. python分类算法评估模型_Python机器学习(sklearn)——分类模型评估与调参总结(下)...
  12. 22. 切勿直接修改set或multiset中的键
  13. Telegram支持删除双方设备中的聊天记录
  14. SQL 的 REGEXP
  15. MATLAB 2015B中文安装激活破解方法图文教程
  16. html在线上传图片,kindeditor 图片上传
  17. IEEE1588工业以太网交换机
  18. 安装ubunut双系统,如何删除其中一个
  19. T410i开机显示fan error修复
  20. From double Click to Main: PAL initialization

热门文章

  1. java基础总结(二十)--Oracle/Sun JDK与OpenJDK的区别和联系
  2. LAMP架构 (资源)
  3. 修改psd图片内文字或图标的颜色
  4. 技术分享 | 在GreatDB分布式部署模式中使用Chaos Mesh做混沌测试
  5. template class T 什么意思
  6. html源码表单页面,HTML-表单标签form及注册页面源码
  7. 网页注册表单设计原则
  8. 一张技术峰会的PPT
  9. SSM理发店会员管理系统
  10. 一次安装过程正处于暂停状态。您必须先撤消该过程做出的修改,然后才能继续。是否撤消那些修改