一、网络通讯方式
在现有的网络中,网络通讯的方式主要有两种:
1.TCP(传输控制协议)方式
2.UDP(用户数据报协议)方式
为了方便理解这两种方式,还是先来看一个例子。大家使用手机时,向别人传递信息时有两种方式:拨打电话和发送短信。使用拨打电话的方式可以保证将信息传递给别人,因为别人接听电话时本身就确认接收到了该信息。而发送短信的方式价格低廉,使用方便,但是接收人有可能接收不到。
在网络通讯中,TCP方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据。而UDP方式就类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。
这两种传输方式都是实际的网络编程中进行使用,重要的数据一般使用TCP方式进行数据传输,而大量的非核心数据则都通过UDP方式进行传递,在一些程序中甚至结合使用这两种方式进行数据的传递。
由于TCP需要建立专用的虚拟连接以及确认传输是否正确,所以使用TCP方式的速度稍微慢一些,而且传输时产生的数据量要比UDP稍微大一些。
关于网络编程的基础知识就介绍这么多,如果需要深入了解相关知识请阅读专门的计算机网络书籍,下面开始介绍Java语言中网络编程的相关技术。
二、网络编程步骤
按照前面的基础知识介绍,无论使用TCP方式还是UDP方式进行网络通讯,网络编程都是由客户端和服务器端组成。当然,B/S结构的编程中只需要实现服务器端即可。所以,下面介绍网络编程的步骤时,均以C/S结构为基础进行介绍。
说明:这里的步骤实现和语言无关,也就是说,这个步骤适用于各种语言实现,不局限于Java语言。
2.1 客户端网络编程步骤
客户端(Client)是指网络编程中首先发起连接的程序,客户端一般实现程序界面和基本逻辑实现,在进行实际的客户端编程时,无论客户端复杂还是简单,以及客户端实现的方式,客户端的编程主要由三个步骤实现:
(1)建立网络连接
客户端网络编程的第一步都是建立网络连接。在建立网络连接时需要指定连接到的服务器的IP地址和端口号,建立完成以后,会形成一条虚拟的连接,后续的操作就可以通过该连接实现数据交换了。
(2)交换数据
连接建立以后,就可以通过这个连接交换数据了。交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,如果客户端不发送请求则服务器端就不响应。
根据逻辑需要,可以多次交换数据,但是还是必须遵循请求响应模型。
(3)关闭网络连接
在数据交换完成以后,关闭网络连接,释放程序占用的端口、内存等系统资源,结束网络编程。
最基本的步骤一般都是这三个步骤,在实际实现时,步骤2会出现重复,在进行代码组织时,由于网络编程是比较耗时的操作,所以一般开启专门的现场进行网络通讯。
2.2 服务器端网络编程步骤
服务器端(Server)是指在网络编程中被动等待连接的程序,服务器端一般实现程序的核心逻辑以及数据存储等核心功能。服务器端的编程步骤和客户端不同,是由四个步骤实现,依次是:
(1)监听端口
服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可。
这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。
(2)获得连接
当客户端连接到服务器端时,服务器端就可以获得一个连接,这个连接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也通过该连接进行数据交换。
一般在服务器端编程中,当获得连接时,需要开启专门的线程处理该连接,每个连接都由独立的线程实现。
(3)交换数据
服务器端通过获得的连接进行数据交换。服务器端的数据交换步骤是首先接收客户端发送过来的数据,然后进行逻辑处理,再把处理以后的结果数据发送给客户端。简单来说,就是先接收再发送,这个和客户端的数据交换数序不同。
其实,服务器端获得的连接和客户端连接是一样的,只是数据交换的步骤不同。
当然,服务器端的数据交换也是可以多次进行的。
在数据交换完成以后,关闭和客户端的连接。
(4)关闭连接
当服务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口以及占用的内存可以释放出来,实现了连接的关闭。
其实服务器端编程的模型和呼叫中心的实现是类似的,例如移动的10086就是典型的呼叫中心,当一个用户拨打10086时,转接给一个专门的客服人员,由该客服实现和该用户的问题解决,当另外一个用户拨打10086时,则转接给另一个客服,实现问题解决,依次类推。
在服务器端编程时,10086这个电话号码就类似于服务器端的端口号码,每个用户就相当于一个客户端程序,每个客服人员就相当于服务器端启动的专门和客户端连接的线程,每个线程都是独立进行交互的。
这就是服务器端编程的模型,只是TCP方式是需要建立连接的,对于服务器端的压力比较大,而UDP是不需要建立连接的,对于服务器端的压力比较小罢了。
三、TCP编程
1.复用性较高的Socket客户端:
package tcp; import java.io.*; import java.net.*; /** * 复用连接的Socket客户端 * 功能为:发送字符串“Hello”到服务器端,并打印出服务器端的反馈 */ public class MulSocketClient { 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[] ={"First","Second","Third"}; try { //建立连接 socket = new Socket(serverIP,port); //初始化流 os = socket.getOutputStream(); is = socket.getInputStream(); byte[] b = new byte[1024]; for(int i = 0;i < data.length;i++){ //发送数据 os.write(data[i].getBytes()); //接收数据 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) {} } } }
复用性较高的ServerSocket:
package tcp; import java.io.*; import java.net.*; /** * 复用连接的echo服务器 * 功能:将客户端发送的内容反馈给客户端 */ public class MulSocketServer { 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); System.out.println("服务器已启动:"); //获得连接 socket = serverSocket.accept(); //初始化流 is = socket.getInputStream(); os = socket.getOutputStream(); byte[] b = new byte[1024]; for(int i = 0;i < 3;i++){ int n = is.read(b); //输出 System.out.println("客户端发送内容为:" + new String(b,0,n)); //向客户端发送反馈内容 os.write(b, 0, n); } } catch (Exception e) { e.printStackTrace(); }finally{ try{ //关闭流和连接 os.close(); is.close(); socket.close(); serverSocket.close(); }catch(Exception e){} } } }
在该示例代码中,也将数据发送和接收的逻辑写在了一个for循环内部,只是在实现时硬性的将循环次数
规定成了3次,这样代码虽然比较简单,但是通用性比较差。
以该服务器端代码实现为基础运行前面的客户端程序时,客户端的输出为:
服务器反馈:First
服务器反馈:Second
服务器反馈:Third
服务器端程序的输出结果为:
服务器已启动:
客户端发送内容为:First
客户端发送内容为:Second
客户端发送内容为:Third
2.服务器端支持多个客户端同时工作
package tcp; import java.net.ServerSocket; import java.net.Socket; /** * 支持多客户端的服务器端实现 */ public class MulThreadSocketServer { public static void main(String[] args) { ServerSocket serverSocket = null; Socket socket = null; //监听端口号 int port = 10000; try { //建立连接 serverSocket = new ServerSocket(port); System.out.println("服务器已启动:"); while(true){ //获得连接 socket = serverSocket.accept(); //启动线程 new LogicThread(socket); } } catch (Exception e) { e.printStackTrace(); }finally{ try{ //关闭连接 serverSocket.close(); }catch(Exception e){} } } }
在该示例代码中,实现了一个while形式的死循环,由于accept方法是阻塞方法,所以当客户端连接未到达时,将阻塞该程序的执行,当客户端到达时接收该连接,并启动一个新的LogicThread线程处理该连接,然后按照循环的执行流程,继续等待下一个客户端连接。这样当任何一个客户端连接到达时,都开启一个专门的线程处理,通过多个线程支持多个客户端同时处理。
下面再看一下LogicThread线程类的源代码实现:
package tcp; import java.io.*; import java.net.*; /** * 服务器端逻辑线程 */ public class LogicThread extends Thread { Socket socket; InputStream is; OutputStream os; public LogicThread(Socket socket){ this.socket = socket; start(); //启动线程 } public void run(){ byte[] b = new byte[1024]; try{ //初始化流 os = socket.getOutputStream(); is = socket.getInputStream(); for(int i = 0;i < 3;i++){ //读取数据 int n = is.read(b); //逻辑处理 byte[] response = logic(b,0,n); //反馈数据 os.write(response); } }catch(Exception e){ e.printStackTrace(); }finally{ close(); } } /** * 关闭流和连接 */ private void close(){ try{ //关闭流和连接 os.close(); is.close(); socket.close(); }catch(Exception e){} } /** * 逻辑处理方法,实现echo逻辑 * @param b 客户端发送数据缓冲区 * @param off 起始下标 * @param len 有效数据长度 * @return */ private byte[] logic(byte[] b,int off,int len){ byte[] response = new byte[len]; //将有效数据拷贝到数组response中 System.arraycopy(b, 0, response, 0, len); return response; } }
摘取开发中实际使用的部分:
http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html
相关推荐
13. Java网络编程中的Socket超时:Socket超时是Java网络编程中的一个重要概念,指的是Socket对象的超时时间。Java程序员可以使用Socket超时来控制网络通信的超时时间。 14. Java网络编程中的网络异常处理:Java网络...
9. **异常处理**:网络编程中常见的异常有IOException、SocketException等,良好的异常处理机制可以确保程序的健壮性。 10. **网络调试工具**:如telnet、curl和Wireshark等,可以帮助开发者测试和调试网络应用。 ...
《Java网络编程(第四版)》是一本深入探讨Java在互联网环境下的编程技术的经典书籍。本书旨在帮助读者理解和掌握如何利用Java语言进行高效、安全的网络通信。书中内容覆盖了从基本的网络概念到复杂的多线程编程,是...
Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程Java网络高级编程
在Java网络编程中,首要涉及的是I/O模型。书中会介绍基础的套接字(Socket)编程,包括TCP和UDP协议的应用。TCP提供面向连接的服务,确保数据的可靠传输,而UDP则是无连接的,更注重传输效率。读者将学习如何创建和...
"Java网络编程实验报告" 本实验报告主要介绍了Java网络编程的基本概念和实现方法,通过设计和实现一个简单的客户端/服务器应用程序,了解Java网络编程的基本原理和实现方法。 知识点1:Java 网络编程基础 Java ...
Java Socket网络编程是Java平台中的核心特性,它为开发者提供了在TCP/IP协议下创建网络应用的能力。Socket编程主要用于实现客户端和服务器之间的通信,基于客户机/服务器模型。在这个模型中,服务器端通常处于被动...
java网络编程.pdf
在本资料中,《Java网络编程》第三版提供了深入浅出的讲解,旨在帮助开发者提升对这一领域的理解。 1. **基础概念**: - **网络模型**:Java网络编程基于OSI七层模型和TCP/IP四层模型。理解这些模型有助于理解网络...
《Java网络编程第三版》是Java开发者深入理解网络编程的重要参考资料。这本书主要涵盖了Java平台上的网络应用程序开发,从基础概念到高级技术,为读者提供了一套全面的学习路径。以下是本书中涉及的一些关键知识点:...
Java网络编程是计算机科学中的一个重要领域,特别是在软件开发中,它涉及到如何通过网络进行数据传输和通信。在Java中,网络编程主要依赖于Java的Socket编程、ServerSocket、URL类以及NIO(非阻塞I/O)等核心API。这...
Java 网络编程实践课程设计报告 这是一份 Java 网络编程实践课程设计报告,旨在帮助学生掌握 Java 编程语言、图形化界面、多线程、网络和数据库等技术,并提高动手实践能力和书本知识学习。该课程设计报告涵盖了 ...
java网络编程pdf java网络编程pdf java网络编程pdf java网络编程pdf java网络编程pdf java网络编程pdf java网络编程pdf java网络编程pdf
Java网络编程
Java网络编程是开发分布式应用程序的关键技术,它使得Java程序能够与其他设备、系统和服务进行通信。本书《Java网络编程实例:Java网络编程实例》显然聚焦于通过实际案例来教授这一核心技能。以下是一些主要的知识点...
- **并发处理**:在网络编程中,为了提高服务效率,通常需要同时处理多个客户端请求。Java的Thread类和Runnable接口提供了多线程支持,可以将每个连接请求分配到独立的线程处理。 - **线程同步与通信**:在多线程...
在TCP/IP协议栈中,Java网络编程通常涉及以下层次: 1. 应用层:这一层包含HTTP、FTP、SMTP等应用协议。Java的`HttpURLConnection`和`HttpClient`库可以处理HTTP通信,而`MailAPI`则处理电子邮件发送。 2. 传输层...
这份《java网络编程》的电子课件,显然是为了帮助开发者深入理解和掌握这些核心概念而设计的。 首先,我们需要理解Java在网络编程中的基础——Socket编程。Java的Socket类提供了客户端与服务器端通信的基本接口,它...
此外,NIO(非阻塞I/O)在Java网络编程中是一个重要的优化手段。传统的Java I/O基于阻塞模型,而NIO引入了选择器和通道的概念,可以同时处理多个连接,提高了系统的并发性能。`java.nio`包下的`Selector`、`...
1. **TCP/IP协议基础**:在Java网络编程中,了解TCP/IP协议族至关重要。TCP(传输控制协议)提供了可靠的、面向连接的数据传输,而IP(互联网协议)则负责将数据包发送到正确的目的地。这两个协议的组合构成了网络...