扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
为什么Java平台能区得如此大的成功呢?它的一个主要原因是因为它从一开始就获得了网络的支持。在这篇文章中,我将向大家介绍如何使用Java sockets实现基本的网络编程。
什么是sockets?
TCP/IP协议是一个非常重要的工具,它在企业应用软件中的组织分布式计算和通信方面有广泛的应用。TCP协议主要处理传输控制任务,而IP协议主要服务于封装的TCP包数据,提供网络和寻址能力。还有另外的一个传输协议层——用户数据报协议(UDP),它是一种无连接数据包协议。被压缩到IP包中。因为UDP包传输不需要连接,所以,它是一种没有确认信息的消息机制。虽然它的速度非常快,但是不可靠。
在任何数据传输前都必须在活动的TCP连接的两端打开sockets。从Java程序员的观点来看,sockets是一个发送数据的通道,也是一个接收数据的通道,它可以接收从其它的计算机上的另一个应用程序发送过来的数据。
为了对TCP连接进行初始化,你可以使用标准的Java库函数java.net包中的类。这个包中包含sockets在任何环境下工作所需要的类,所以你的Java真正地保留了平台独立性。
调用java.net的类被转换成调用操作系统的API,所有TCP/IP实现的细节都被软件开发人员隐藏了。对于TCP sockets,你需要使用InetAddress、Socket和 ServerSocket包。对于UDP sockets,你需要使用DatagramSocket类和DatagramPacket类。
你甚至可以在TCP或者UDP的基础是创建新的网络协议。为了达到这个目的,你需要使用特殊的类和界面,包括SocketImplFactory、 SocketImpl和 DatagramSocketImpl。
服务器端
我下面将写一个小的客户/服务器应用程序,其中包括在服务器上不断监听来到的连接请求,和在客户端应用程序连接服务器的进程和传输数据。这两个程序是独立运行的,它们要装在不同的主机上。
最开始,服务器程序创建一个新的ServerSocket对象,这个对象是用来监听指定的端口的。(在编写服务器应用程序的时候,需要选择一个没有被其它服务占用的端口。)下面的例子中,服务器监听了端口4444:
import java.io.*;
import java.net.*;
…
try {
serverSocket = new ServerSocket(4444);
} catch (IOException e) {
System.out.println("Could not listen on port: 4444");
System.exit(-1);
}
ServerSocket是java.net的一个类,它提供了一个在服务器端独立的实现客户/服务器socket连接。如果我们不能监听指定的端口,ServerSocket构造器将抛出一个异常(例如,当端口被占用的时候将抛出一个异常)。
如果服务器能与端口成功的绑定,那么ServerSocket对象就被创建了,这时候,下一步就是——接受来自客户端的连接。
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.out.println("Accept failed: 4444");
System.exit(-1);
}
Accept方法一直处于等待状态,直到客户端开始要求与主机和该服务器所指定的端口进行连接的时候。当需要连接并成功创建连接的时候,accept方法返回一个新的Socket对象,这个对象与相同的本地端口绑定,并包含它的客户端的远程地址和远程端口设置。
服务器用这个新的Socket与客户端通信,同时继续在初始的ServerSocket上的监听客户端的连接请求。(这个特殊的程序版本不需要监听更多的客户连接请求。)
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者