TCP/IP运用实例

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(); 
		
	}
}

【完】

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值