IO流的介绍
说起TCP/IP,首先不得不以IO流作为基础。以下图片包含常用流,与IO流的分类。其中节点流直接对源文件进行操作。处理流是使用修饰器模式对节点流进行包装,使用数组缓冲的方式,对文件的处理效率更高。
TCP/IP的相关概念
TCP协议:传输控制协议
1.使用TCP协议前,预先建立TCP连接,形成传输数据通道
2.传输前,采用"三次握手"方式,是可靠的
3.TCP协议进行通信的两个应用进程:客户端、服务端
4.在连接中可进行最大数据量的传输
5.传输完毕,需要释放自己建立的连接,效率低
UDP协议
1.将数据、源、目的封装成数据包,不需要建立连接
2.每个数据报的大小限制在64K以内
3.因无需连接,故是不可靠的
4.发送数据结束时无需释放资源(因为不是面向连接的),速度快
5.举例:厕所通知:发短信
示例:
示例说明如下:
(1)编写客户端程序和服务器端程序
(2)客户端可以输入一个音乐文件名,比如《珊瑚海》,服务端收到音乐名后,可以给客户端返回这个 e:\\test.txt文件,如果服务器没有这个文件,返回一个默认的 e:\\1.png文件 即可。
(3)服务端收到文件后,保存到本地 e:\\save.txt
(4)提示:该程序可以使用 StreamUtils.java
服务端示例代码:
package com.sinosoft.lis.g_pos;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPTestServer {
/**
* (4)提示:该程序可以使用 StreamUtils.java
*
* 本质:其实就是 指定下载文件的应用。
* @throws IOException
*/
public void acceptFile() throws IOException {
//1.服务端在9999接口监听.....
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务端正在9999端口监听......");
Socket socket = serverSocket.accept();
//2.读取客户端需要下载的音乐
/* BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
char[] fileNameBuffer = new char[1024];
String downloadFileName="";
int len;
while((len = reader.read(fileNameBuffer)) != -1) {
downloadFileName += new String(fileNameBuffer, 0, len);
} */
ByteArrayOutputStream buffer = TCPTestServer.getByteArrayStream(socket.getInputStream());
String downloadFileName = new String(buffer.toByteArray(), "utf8");
if("珊瑚海".equals(downloadFileName)) {
downloadFileName = "e:\\test.txt";
} else {
downloadFileName = "e:\\1.png";
}
//3.写入输出流,放入socket输出流
FileInputStream fis = new FileInputStream(downloadFileName);
buffer = TCPTestServer.getByteArrayStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
bos.write(buffer.toByteArray());
bos.flush();
socket.shutdownOutput();
socket.close();
bos.close();
fis.close();
buffer.close();
serverSocket.close();
}
/**
* 把字节流写入缓冲流中
* @param is
* @return
* @throws IOException
*/
public static ByteArrayOutputStream getByteArrayStream(InputStream is) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len=0;
while((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
return baos;
}
public static void main(String[] args) {
TCPTestServer server = new TCPTestServer();
try {
server.acceptFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端示例代码:
package com.sinosoft.lis.g_pos;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCPTestClient {
/**
* (4)提示:该程序可以使用 StreamUtils.java
*
* 本质:其实就是 指定下载文件的应用。
* @throws IOException
* @throws UnknownHostException
*/
public void sendFile() throws UnknownHostException, IOException {
//1.客户端创建TCP连接请求
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
//2.输入要下载的歌曲名称
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
bos.write("珊瑚海".getBytes());
bos.flush();
socket.shutdownOutput();
//3.获取到输入流,保存歌曲内容
ByteArrayOutputStream buffer = TCPTestServer.getByteArrayStream(socket.getInputStream());
BufferedOutputStream musicStream = new BufferedOutputStream(new FileOutputStream("e:\\save.txt"));
musicStream.write(buffer.toByteArray());
musicStream.close();
buffer.close();
bos.close();
System.out.println("保存文件完毕...");
}
public static void main(String[] args) throws IOException {
/*把test.txt文件读入内存,再通过屏幕显示出来。内容:你好,中国人*/
/* BufferedReader fis = new BufferedReader(new InputStreamReader(new FileInputStream("e:\\test.txt"), "gbk"));
char[] buffer = new char[1024];
int len;
while((len = fis.read(buffer)) != -1) {
System.out.print(new String(buffer, 0, len));
}
fis.close();
*/
/* ByteArrayOutputStream buffer = TCPTestServer.getByteArrayStream(new FileInputStream("e:\\test.txt"));
String name = new String(buffer.toByteArray(), "gbk");
System.out.println(name); */
TCPTestClient client = new TCPTestClient();
client.sendFile();
}
}
【完】