Java网络编程基础 Socket类的使用方法详解
Java-socket编程(建立连接)

Java-socket编程(建⽴连接)socket编程是以IO为理论基础的,理论学得差不多也很难实现编程,毕竟⾥⾯的类和⽅法平时都不怎么⽤,难得尝试编了个程,记录⼀下。
1.⼏个概念Channel:管道,连通客户端和服务端传输数据;Buffer:缓冲区,通过管道传输数据必须经过的地⽅;Selector:选择器,单线程可以通过选择器处理多个管道;本⽂没有使⽤;2.案例功能启动服务端,再启动客户端与服务端连接,在客户端的控制台输⼊命令获取服务端的效果。
本样例只处理了“time”命令,获取服务端的当前时间,其他命令都返回“⾮指定命令,⽆返回值”。
详看代码注释。
3.服务端代码1import .InetSocketAddress;2import java.nio.ByteBuffer;3import java.nio.channels.ServerSocketChannel;4import java.nio.channels.SocketChannel;5import java.nio.charset.StandardCharsets;6import java.util.Date;7import java.util.LinkedList;89public class NIOService {10static int PORT = 9011;11public static void main(String[] args) throws Exception{12//存储客户端连接13 LinkedList<SocketChannel> clients = new LinkedList<>();14//1.服务端开启监听:接受客户端15 ServerSocketChannel ss = ServerSocketChannel.open();16 ss.bind(new InetSocketAddress(PORT));17//2.只接受客户端,不阻塞18 ss.configureBlocking(false);1920while (true) {21// 接受客户端的连接22// client在Java层⾯是⼀个对象,在内核层⾯是⼀个fd23 SocketChannel client = ss.accept();24if (client == null) {25//while循环进来没有连到客户端就不管26 } else {27//和client传输数据使⽤的socket->fd28 client.configureBlocking(false);29//获取客户端的端⼝号30int port = client.socket().getPort();31 System.out.println("接收到客户端的连接,client port: " + port);32//将客户端添加到列表⾥33 clients.add(client);34 }35//可以在堆⾥,堆外,相关内容,可以看看JVM直接内存36 ByteBuffer buffer = ByteBuffer.allocateDirect(4096);3738//遍历已经链接进来的客户端的管道channel⾥有没有数据39for (SocketChannel c : clients) {40//每循环⼀次都是⼀次系统调⽤,都是⼀次⽤户内核态的切换41int num = c.read(buffer);42if (num > 0) {43 buffer.flip();44byte[] bytes = new byte[buffer.limit()];45 buffer.get(bytes);46 String s = new String(bytes);47 System.out.println("端⼝为"+c.socket().getPort() + "的客户端发来命令:" +s);48 String res = "";49 ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4096);50if("time".equals(s)){51//获取时间52long l = System.currentTimeMillis();53 res = "time: "+new Date(l).toString();54 System.out.println(res);55 }else{56 res = "⾮指定命令,⽆返回值";57 }58 byteBuffer.put(res.getBytes(StandardCharsets.UTF_8));59 byteBuffer.flip();60 c.write(byteBuffer);61 }62 buffer.clear();63 }64 }65 }66 }4.客户端代码1import java.io.*;2import .Socket;3import java.nio.channels.ServerSocketChannel;4import java.nio.channels.SocketChannel;5import java.util.Scanner;67public class Client {8public static void main(String[] args) {9try {10//建⽴⼀个客户端连到9010的服务端11 Socket client = new Socket("127.0.0.1",9011);12//设置发送命令的长度13 client.setSendBufferSize(20);14/**15 * 关闭Nagle算法:该算法是将多个命令打包⼀起发送给服务端,避免⽹络拥挤。
java serversocket方法

java serversocket方法Java中的ServerSocket类是包的一部分,它提供了在服务器端创建套接字以便监听并接受客户端连接请求的机制。
ServerSocket通常用于服务器应用程序中,以便可以建立基于TCP协议的网络通信。
在本文中,我们将详细探讨ServerSocket类的关键方法及其使用。
ServerSocket类的构造方法ServerSocket类提供了几种构造方法来创建一个服务器套接字。
最常用的构造方法如下:1. `ServerSocket(int port)`:创建绑定到指定端口的服务器套接字。
如果端口为0,则会自动分配一个空闲端口。
2. `ServerSocket(int port, int backlog)`:创建绑定到指定端口的服务器套接字,并指定客户端连接请求的队列长度。
3. `ServerSocket(int port, int backlog, InetAddress bindAddr)`:创建绑定到指定IP地址和端口的服务器套接字,并指定客户端连接请求的队列长度。
常用方法accept()`accept()`方法是ServerSocket类中最重要的方法之一。
它用于监听并接受到达服务器的连接请求。
当一个客户端请求连接时,`accept()`方法会阻塞,直到一个连接建立,然后返回一个新的Socket对象用于与客户端通信。
```javapublic Socket accept() throws IOException```close()`close()`方法用于关闭服务器套接字。
一旦服务器套接字被关闭,就不能再继续接受新的连接请求。
```javapublic void close() throws IOException```getInetAddress()`getInetAddress()`方法返回服务器套接字绑定的本地地址。
如果套接字未绑定,则返回null。
java socket flush方法 断开的管道 -回复

java socket flush方法断开的管道-回复java中的Socket类提供了一种在网络上进行通信的方式。
在实际应用中,我们经常会遇到断开通信管道的情况,也就是网络连接的断开。
为了应对这种情况,我们可以使用Socket类中的flush方法来确保数据发送成功并断开连接。
本文将一步一步详细解释Java Socket的flush方法以及如何处理断开的管道。
一、Socket类概述Socket类是Java提供的用于网络编程的类,它提供了建立客户端和服务器之间通信的能力。
通过Socket类,我们可以连接到远程主机,向远程主机发送数据,以及接收远程主机发送的数据。
二、Socket类的flush方法flush方法是Socket类中提供的一个用于刷新输出流的方法。
在网络通信中,客户端通过输出流向服务器发送数据,而服务器则通过输入流接收这些数据。
当调用flush方法时,它会强制将输出流中的数据发送到服务器,并清空输出流,以确保发送成功。
三、flush方法的使用在使用Socket进行网络通信时,我们通常会创建一个输出流用于发送数据,并调用flush方法来确保数据发送成功。
下面是一个示例代码:javaimport java.io.*;import .*;public class Client {public static void main(String[] args) {try {Socket socket = new Socket("127.0.0.1", 8000);OutputStream outputStream =socket.getOutputStream();BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));bufferedWriter.write("Hello Server!");bufferedWriter.flush();bufferedWriter.close();socket.close();} catch (IOException e) {e.printStackTrace();}}}在上面的示例代码中,我们创建了一个Socket对象,并指定了服务器的IP地址和端口号。
Java套接字(Socket)详解

Java套接字(Socket)详解套接字(socket)为两台计算机之间的通信提供了⼀种机制,在JamesGosling注意到Java语⾔之前,套接字就早已赫赫有名。
该语⾔只是让您不必了解底层操作系统的细节就能有效地使⽤套接字。
1 客户机/服务器模型在饭店⾥,菜单上各种具有异国情调的⾷品映⼊你的眼帘,于是你要了⼀份pizza。
⼏分钟后,你⽤⼒咀嚼浇着融化的乳酪和其他你喜欢的配料的热pizza。
你不知道,也不想知道:侍者从那⾥弄来了pizza,在制作过程中加进了什么,以及配料是如何获得的。
上例中包含的实体有:美味的pizza、接受你定餐的侍者、制作pizza的厨房,当然还有你。
你是定pizza的顾客或客户。
制作pizza的过程对于你⽽⾔是被封装的。
你的请求在厨房中被处理,pizza制作完成后,由侍者端给你。
你所看到的就是⼀个客户机/服务器模型。
客户机向服务器发送⼀个请求或命令。
服务器处理客户机的请求。
客户机和服务器之间的通讯是客户机/服务器模型中的⼀个重要组成部分,通常通过⽹络进⾏。
客户机/服务器模型是⼀个应⽤程序开发框架,该框架是为了将数据的表⽰与其内部的处理和存储分离开来⽽设计的。
客户机请求服务,服务器为这些请求服务。
请求通过⽹络从客户机传递到服务器。
服务器所进⾏的处理对客户机⽽⾔是隐藏的。
⼀个服务器可以为多台客户机服务。
多台客户机访问服务器服务器和客户机不⼀定是硬件组件。
它们可以是⼯作啊同⼀机器或不同机器上的程序。
、考虑⼀个航空定票系统中的数据输⼊程序:数据----乘客名、航班号、飞⾏⽇期、⽬的地等可以被输⼊到前端----客户机的应⽤程序中。
⼀旦数据输⼊之后,客户机将数据发送到后端----服务器端。
服务器处理数据并在数据库中保存数据。
客户机/服务器模型的重要性在于所有的数据都存放在同⼀地点。
客户机从不同的地⽅访问同⼀数据源,服务器对所有的输⼊数据应⽤同样的检验规则。
万维⽹为‘为什么要将数据的表⽰与其存储、处理分离开来’提供了⼀个很好的例⼦。
java socket编程方案

java socket编程方案一、网络编程中两个主要的问题一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。
在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。
而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。
目前较为流行的网络编程模型是客户机/服务器(C/S)结构。
即通信双方一方作为服务器等待客户提出请求并予以响应。
客户则在需要服务时向服务器提出申请。
服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。
二、两类传输协议:TCP;UDPTCP是一种面向连接的保证可靠传输的协议。
通过TCP协议传输,得到的是一个顺序的无差错的数据流。
发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket 连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。
UDP是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
比较:UDP:1,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。
2,UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。
3,UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方TCP:1,面向连接的协议,在socket之间进行数据传输之前必然要建立连接,所以在TCP中需要连接时间。
java nio socket编程技巧

标题:深度探讨Java NIO Socket编程技巧一、引言在当今信息高速传递的时代,网络编程已经成为了软件开发中不可或缺的一部分。
而Java NIO(New Input/Output)作为一个非阻塞I/O和多路复用的解决方案,提供了更高效率的Socket编程方式。
本文将深入探讨Java NIO Socket编程的技巧,帮助读者更好地理解和运用这一技术。
二、NIO简介Java NIO是在JDK 1.4中引入的新输入/输出库,提供了一种基于通道(Channel)和缓冲区(Buffer)的I/O操作方式。
相比于传统的I/O操作,NIO具有更高的效率和灵活性,特别适用于网络编程中的Socket操作。
三、Socket编程基础在进行Java NIO Socket编程之前,首先需要掌握Socket编程的基础知识。
Socket编程是指通过网络进行通信的一种方式,它基于TCP/IP协议,可以实现客户端和服务器之间的数据交互。
在Java中,可以使用Socket和ServerSocket类来实现Socket编程,并通过InputStream和OutputStream来进行数据读写操作。
四、NIO Socket编程技巧1. 非阻塞模式NIO的非阻塞模式是其最大的特点之一,可以大大提高系统的并发能力。
在使用NIO进行Socket编程时,可以通过设置通道为非阻塞模式,使得通道在没有数据传输时不会被阻塞,从而可以同时处理多个连接。
2. 选择器(Selector)选择器是NIO的核心组件之一,可以实现单线程处理多个通道的能力。
在Socket编程中,可以通过选择器来监听多个通道上的事件,并对其进行响应。
这样一来,就可以实现高效的多路复用。
3. 缓冲区管理在NIO中,数据读写操作都是通过缓冲区来进行的。
良好的缓冲区管理是非常重要的一环。
在Socket编程中,需要合理地管理读取和写入操作的缓冲区,以避免数据丢失和溢出的情况。
4. 异步通道NIO还提供了异步通道的能力,可以实现非阻塞的I/O操作。
《Java网络编程实战—Socket编程实践课件》
Socket实例:创建客户端和服务器
本节内容将通过实例演示如何使用Socket类创建客户端和服务器。我们将一步步进行示范,并同时解释代码背 后的原理。一起来实践Socket编程,构建属于自己的网络应用吧!
Socket通信:发送和接收数据
本节内容将深入讲解如何使用Socket实现数据的传输和接收。我们将涵盖常 见的数据传输方式和编码解码技术。让我们一起学习Socket通信的精华知识 吧!
Hale Waihona Puke ServerSocket和Socket
本节内容将重点介绍ServerSocket和Socket的使用方法和区别。我们将学习如何创建服务器和客户端并进行双 向通信。一起来探索ServerSocket和Socket的精彩世界吧!
TCP与UDP协议
本节内容将比较TCP和UDP两种常见的网络传输协议。我们将了解它们各自的特点、优势和适用场景。让我们 一起深入了解TCP和UDP协议的异同吧!
《Java网络编程实战— Socket编程实践课件》
欢迎来到《Java网络编程实战—Socket编程实践课件》。在本课程中,我们将 深入介绍Java的网络编程知识,并通过实践来加深理解。让我们一起探索这 个令人兴奋的主题!
介绍
本节内容主要介绍Java网络编程的基本概念和应用范围。我们将学习网络编 程的重要性以及它在现代软件开发中的角色。让我们开始探索这个令人兴奋 的主题吧!
Socket编程概述
本节内容将概述Socket编程的基本原理和工作方式。我们将了解何为Socket 以及它在网络通信中的作用。一起来探索Socket编程的奥秘吧!
Java Socket类
本节内容将深入介绍Java中的Socket类。我们将学习如何使用Socket类进行网 络通信以及它的常见用法。让我们一起探索Java Socket类的强大功能吧!
socket网络编程教程
socket网络编程教程Socket网络编程是一种常用的网络通信方式,它在不同设备之间建立网络连接并进行数据传输。
这种编程方式能够满足各种应用程序对于网络通信的需求,例如实时通信、文件传输、远程控制等。
本文将为您介绍Socket网络编程的基本概念、使用方法以及相关的一些注意事项。
一、Socket网络编程的基本概念1. Socket:Socket是指在网络中进行通信的两个端点,它包括了IP 地址和端口号。
在客户端和服务器之间建立Socket连接后,可以进行双向的数据传输。
2. TCP/IP协议:TCP/IP协议是一种主要用于Internet上的协议,它包括了传输控制协议(TCP)和互联网协议(IP)。
TCP负责数据的可靠传输,而IP则负责数据包在网络中的传输。
3.套接字地址:套接字地址包括了IP地址和端口号,用于唯一标识网络中的一个节点。
客户端通过套接字地址连接到服务器,服务器通过套接字地址接受客户端的连接。
4.套接字类型:套接字类型包括流式套接字(TCP)和数据报套接字(UDP)。
流式套接字提供了面向连接的服务,保证数据的可靠传输;数据报套接字则提供了无连接的服务,适合于传输数据量较小的应用。
二、Socket网络编程的使用方法Socket网络编程可以使用多种编程语言实现,例如Python、Java、C++等。
下面以Python为例,介绍Socket网络编程的使用方法。
1.服务器端代码示例:```pythonimport socket# 创建TCP socket对象server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#绑定套接字地址server_address = ('localhost', 8888)server_socket.bind(server_address)#开始监听连接server_socket.listen(5)while True:#等待客户端连接client_socket, client_address = server_socket.accept #接收客户端数据data = client_socket.recv(1024)#处理客户端请求response = 'Hello, ' + data.decode#发送响应到客户端client_socket.sendall(response.encode()#关闭客户端连接client_socket.close```2.客户端代码示例:```pythonimport socket# 创建TCP socket对象client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#连接服务器server_address = ('localhost', 8888)client_socket.connect(server_address)#发送数据到服务器message = 'World'client_socket.sendall(message.encode()#接收服务器响应response = client_socket.recv(1024)print(response.decode()#关闭客户端连接client_socket.close```三、Socket网络编程的注意事项2.数据的传输大小:对于大文件的传输,流式套接字(TCP)更加稳定可靠。
Javasocket详解
Javasocket详解参考刚给⼤家讲解Java socket通信后,好多童鞋私信我,有好多地⽅不理解,看不明⽩。
特抽时间整理⼀下,详细讲述Java socket通信原理和实现案例。
整个过程楼主都是通过先简单明了的⽰例让⼤家了解整个基本原理,后慢慢接近⽣产实⽤⽰例,先概况后脉络给⼤家梳理出来的,所有涉及⽰例都可以直接拷贝运⾏。
楼主才疏学浅,如有部分原理错误请⼤家及时指正.整理和总结了⼀下⼤家常遇到的问题:1. 客户端socket发送消息后,为什么服务端socket没有收到?2. 使⽤while 循环实现连续输⼊,是不是就是多线程模式?3. 对多线程处理机制不是很明⽩,希望详细讲解?4. 希望详细讲解ServerSocketChannel和SocketChannel与ServerSoket和Socket的区别?5. 希望有详细的例⼦,可以直接拷贝下来运⾏?针对童鞋们提出的问题,我会在本⽂章中详细⼀⼀简答,并且给出详细的例⼦,下⾯⾔归正传。
⼀、socket通信基本原理⾸先socket 通信是基于TCP/IP ⽹络层上的⼀种传送⽅式,我们通常把TCP和UDP称为传输层。
如上图,在七个层级关系中,我们将的socket属于传输层,其中UDP是⼀种⾯向⽆连接的传输层协议。
UDP不关⼼对端是否真正收到了传送过去的数据。
如果需要检查对端是否收到分组数据包,或者对端是否连接到⽹络,则需要在应⽤程序中实现。
UDP常⽤在分组数据较少或多播、⼴播通信以及视频通信等多媒体领域。
在这⾥我们不进⾏详细讨论,这⾥主要讲解的是基于TCP/IP协议下的socket通信。
socket是基于应⽤服务与TCP/IP通信之间的⼀个抽象,他将TCP/IP协议⾥⾯复杂的通信逻辑进⾏分装,对⽤户来说,只要通过⼀组简单的API就可以实现⽹络的连接。
借⽤⽹络上⼀组socket通信图给⼤家进⾏详细讲解:⾸先,服务端初始化ServerSocket,然后对指定的端⼝进⾏绑定,接着对端⼝及进⾏监听,通过调⽤accept⽅法阻塞,此时,如果客户端有⼀个socket连接到服务端,那么服务端通过监听和accept⽅法可以与客户端进⾏连接。
浅谈JavaSocket网络编程
0.引言Java语言已经成为Internet上最为流行的编程语言,它之所以适合编写网络应用程序主要归功于它的以下优势。
第一,Java语言的平台无关性使得它能够运行在各种不同的平台上,这些运行在不同平台的Ja-va程序能够方便的进行网络通信。
第二,Java语言的安全性使得可以对程序进行权限检查,这对网络程序非常重要。
第三,JDK类库提供了丰富的网络类库,能够简化网络程序的开发过程。
套接字(Socket)是Java 网络编程的基础,本文主要介绍Socket通信的基本原理,然后在这些原理的基础上,用Java实现了一个多用户网上聊天系统。
1.充分理解Socket所谓socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。
应用程序通常通过“套接字”向网络发出请求或者应答网络请求。
在C/S模式中,客户端需要主动创建与服务器连接的Socket,服务器端收到客户端的连接请求后,也会创建与客户端连接的Socket。
Socket可以看做是通信连接两端的收发器,服务器和客户端都通过Socket来收发数据。
在JDK中,Socket和ServerSocket是实现Socket通信的主要工具,创建一个ServerSocket对象就创建了一个监听服务,创建一个Socket对象就建立了一个服务器与客户端之间的连接。
这两个类位于包中。
ServerSocket用于服务器端,Socket是建立网络连接时使用的。
在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,可以完成所需的会话。
.Socket继承于ng.Object,它的方法不多,下面介绍使用最频繁的三个方法:accept方法用于产生“阻塞”,直到接受到一个连接,并且返回一个客户端的Socket对象实例。
“阻塞”的含义是指使程序运行暂时“停留”在这个地方,直到一个会话产生,然后程序继续;通常“阻塞”是由循环产生的。
getInputStream方法获得网络连接输入,同时返回一个IutputStream 对象实例。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java网络编程基础 Socket类的使用方法详解.txt心态决定状态,心胸决定格局,眼界决定境界。当你的眼泪忍不住要流出来的时候,睁大眼睛,千万别眨眼,你会看到世界由清晰到模糊的全过程。当客户程序需要与服务器程序通讯的时候,客户程序在客户机创建一个socket对象,Socket类有几个构造函数。
两个常用的构造函数是 Socket(InetAddress addr, int port) 和 Socket(String host, int port),两个构造函数都创建了一个基于Socket的连接服务器端流套接字的流套接字。对于第一个InetAddress子类对象通过addr参数获得服务器主机的IP地址,对于第二个函数host参数包被分配到InetAddress对象中,如果没有IP地址与host参数相一致,那么将抛出UnknownHostException异常对象。两个函数都通过参数port获得服务器的端口号。假设已经建立连接了,网络API将在客户端基于Socket的流套接字中捆绑客户程序的IP地址和任意一个端口号,否则两个函数都会抛出一个IOException对象。
如果创建了一个Socket对象,那么它可能通过调用Socket的 getInputStream()方法从服务程序获得输入流读传送来的信息,也可能通过调用Socket的 getOutputStream()方法获得输出流来发送消息。在读写活动完成之后,客户程序调用close()方法关闭流和流套接字,下面的代码创建了一个服务程序主机地址为198.163.227.6,端口号为13的Socket对象,然后从这个新创建的Socket对象中读取输入流,然后再关闭流和Socket对象。
Socket s = new Socket ("198.163.227.6", 13); InputStream is = s.getInputStream (); // Read from the stream. is.close (); s.close ();
接下面我们将示范一个流套接字的客户程序,这个程序将创建一个Socket对象,Socket将访问运行在指定主机端口10000上的服务程序,如果访问成功客户程序将给服务程序发送一系列命令并打印服务程序的响应。List2使我们创建的程序SSClient的源代码:
Listing 2: SSClient.java
// SSClient.java import java.io.*; import java.net.*;
class SSClient { public static void main (String [] args) { String host = "localhost"; // If user specifies a command-line argument, that argument // redivsents the host name.
if (args.length == 1) host = args [0];
BufferedReader br = null; PrintWriter pw = null; Socket s = null;
try { // Create a socket that attempts to connect to the server // program on the host at port 10000.
s = new Socket (host, 10000); // Create an input stream reader that chains to the socket's // byte-oriented input stream. The input stream reader // converts bytes read from the socket to characters. The // conversion is based on the platform's default character // set.
InputStreamReader isr; isr = new InputStreamReader (s.getInputStream ());
// Create a buffered reader that chains to the input stream // reader. The buffered reader supplies a convenient method // for reading entire lines of text.
br = new BufferedReader (isr); // Create a print writer that chains to the socket's byte- // oriented output stream. The print writer creates an // intermediate output stream writer that converts // characters sent to the socket to bytes. The conversion // is based on the platform's default character set.
pw = new PrintWriter (s.getOutputStream (), true); // Send the DATE command to the server. pw.println ("DATE"); // Obtain and print the current date/time. System.out.println (br.readLine ()); // Send the PAUSE command to the server. This allows several // clients to start and verifies that the server is spawning // multiple threads.
pw.println ("PAUSE");
// Send the DOW command to the server. pw.println ("DOW"); // Obtain and print the current day of week. System.out.println (br.readLine ()); // Send the DOM command to the server. pw.println ("DOM"); // Obtain and print the current day of month. System.out.println (br.readLine ()); // Send the DOY command to the server. pw.println ("DOY"); // Obtain and print the current day of year. System.out.println (br.readLine ()); } catch (IOException e) { System.out.println (e.toString ()); } finally { try { if (br != null) br.close ();
if (pw != null) pw.close ();
if (s != null) s.close (); } catch (IOException e) { }
} } }
运行这段程序将会得到下面的结果: Tue Jan 29 18:11:51 CST 2002 TUESDAY 29 29 SSClient创建了一个Socket对象与运行在主机端口10000的服务程序联系,主机的IP地址由host变量确定。SSClient将获得Socket的输入输出流,围绕BufferedReader的输入流和PrintWriter的输出流对字符串进行读写操作就变得非常容易,SSClient个服务程序发出各种date/time命令并得到响应,每个响应均被打印,一旦最后一个响应被打印,将执行Try/Catch/Finally结构的Finally子串,Finally子串将在关闭Socket之前关闭BufferedReader 和 PrintWriter。
在SSClient源代码编译完成后,可以输入java SSClient 来执行这段程序,如果有合适的程序运行在不同的主机上,采用主机名/IP地址为参数的输入方式,比如www.sina.com.cn是运行服务器程序的主机,那么输入方式就是java SSClient www.sina.com.cn。
技巧 Socket类包含了许多有用的方法。比如getLocalAddress()将返回一个包含客户程序IP地址的InetAddress子类对象的引用;getLocalPort()将返回客户程序的端口号;getInetAddress()将返回一个包含服务器IP地址的InetAddress子类对象的引用;getPort()将返回服务程序的端口号。