套接字 socket
几个重要概念:
网络通信协议概念:计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。
网络通信接口:为了使两个结点之间能够进行对话,必须在它们之间建立通信工具(即接口),使彼此之间能进行信息交换。接口包括两部分:
硬件装置:实现结点之间的信息传送。
软件装置:规定双方进行通信的约定协议。
IP(InternetProtocol)协议:是网际层(OSI参考模型)的主要协议,支持网间互联的数据报通信。
TCP(Transmission control protocol)协议:是专门设计用于在不可靠得的因特网上提供可靠、端到端的字节流通信的协议。它是一种面向连接的协议。TCP连接是字节流而非报文流。
Socket:
1.两个JAVA应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket。
2.Socket通常用来实现client-server连接。
3.Java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向连接的client端和server端。
4.建立连接时所需的寻址信息为远程计算机的IP地址和端口号(port number)
Java流式输出/输出原理:在Java程序中,对于数据的输入(input)/输出(output)操作以“流”(stream)方式进行,java.io包中定义了各样的“流”类,用以获取不同种类的数据。
TCP/IP Socket通信:
Client |
Socket(host,port#) (Attempt to connect) |
OutputStream
InputStream |
Socket.close() |
Server |
ServerSocket s(port #) s.accept() /等待连接 socket对象
|
OutputStream
InputStream
|
Socket.close()
|
Server端:
首先导入所需要的包
l 首先导入所需要的包
import java.io.*; import java.net.*;
|
l 定义server端的socket
ServerSocket server = null; |
l Server端开启socket通信的连接端口
server = new ServerSocket(4700); |
l 定义接收client端连接的socket
Socket socket = null; |
l Server端监听并接受到套接字的连接。
socket = server.accept(); |
l 启用java输出输出流实现对数据流进行接收和发送
BufferedReader is = new BufferedReader(new InputStreamReader( socket.getInputStream()));//将server端输入通道包上缓冲流指向client端 PrintWriter os = new PrintWriter(socket.getOutputStream());//将server端的输出通道包上打印流指向client端 BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));//将server端输入通道指向标准键盘输入 |
l 调用流的readLine()方法从client端读一行,如果client没有内容,则处于阻塞状态,直到client端向server端发送了数据
System.out.println("Client:" + is.readLine()); |
l 从键盘读入数据,此方法也为阻塞式
String line = sin.readLine(); |
l 输出从键盘读入的数据到client端
os.println(line); |
l 启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。将此选项设为非零的超时值时,在与此 Socket 关联的 InputStream 上调用 read() 将只阻塞此时间长度。如果超过超时值,将引发 java.net.SocketTimeoutException,虽然 Socket 仍旧有效。选项必须在进入阻塞操作前被启用才能生效。超时值必须是 > 0 的数。超时值为 0 被解释为无穷大超时值。
socket.setSoTimeout(timeout); |
l 捕捉异常,输出提示语句并且执行退出
catch(SocketTimeoutException e){ System.out.println("等待传输数据超时.."); System.exit(0); } |
Client端:
l Client端建立到server端的tcp socket连接,4700端口为server端侦听的端口
Socket socket = new Socket("127.0.0.1",4700); |
l 初始化输出/输出
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));//将client输入端指向标准键盘 PrintWriter os = new PrintWriter(socket.getOutputStream());//将client输出端指向server端 BufferedReader is = new BufferedReader(new InputStreamReader( socket.getInputStream()));//将client输入端指向server端 |
l 客户端从键盘读取数据
readline = sin.readLine(); |
l Client端等待从server端输入的数据,此方法为阻塞方法
System.out.println("Server:" + is.readLine()); |
l Client端输出数据到server端
os.println(readline); |
l Client端同样设置了超时退出
socket.setSoTimeout(timeout); |