<>Java:基于TCP协议socket网络编程的文件传送

<>先了解一下socket基本概念
<>socket也叫套接字:
是指在网路中不同主机上的应用进程之间,进行双向通信的端点的抽象。

简单理解就是:

两个主机之间要通信,就需要知道彼此的ip,端口号等信息,而一台主机这些信息的集合:

就可以理解为一个端点,即为套接字

双方通过套接字作为一种坐标,建立信息通道,形成连接(两点连接一条直线)

简单理解了套接字的概念后,来看看如何通过java socket编程来实现

两台主机文件的接收与发送:

<>代码如下:

<>发送方:
import java.io.*; import java.net.InetAddress; import java.net.Socket; /** *
发送者 */ public class TcpSendCilent { public static void main(String[] args)
throws Exception { //1.通过socket对象 创建socket连接 Socket socket = new Socket(
InetAddress.getByName("127.0.0.1"), 9000); //2,创建一个字节输出流 OutputStream os =
socket.getOutputStream(); //3.字节文件输入流 读取文件 //避免出错 写需要发送文件的绝对路径 FileInputStream
fis= new FileInputStream(new File("F:/TEST/1604407051256.jpg")); //4.字节文件输出流
写出文件 byte[] buffer=new byte[1024*10]; int len; while ((len=fis.read(buffer))!=-1
){ //socket编程基于I/O流 所以 //输出流写转为字节数组的文件 =向接收方发送文件 os.write(buffer,0,len); }
//通知服务器我传送完了 调用shutdownOutput() 否则影响接下来代码执行 socket.shutdownOutput();
//确定服务器接受完毕,断开连接 //获取接收方响应回来的 接受完毕! 响应 InputStream inputStream = socket.
getInputStream(); ByteArrayOutputStream baos=new ByteArrayOutputStream(); byte[]
bytes2=new byte[1024*10]; int len2; while ((len2=inputStream.read(bytes2))!=-1)
{ baos.write(bytes2,0,len2); } //显示接收方的响应 System.out.println(baos.toString());
//发送结束后,最后关闭所有资源 //关闭资源好习惯 这部分写的简单 //一般建议先进行一个非空判断再关闭 baos.close(); fis.close();
os.close(); socket.close(); } }
<>接收方:
import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** *
接收端 */ public class TcpAcceptServer { public static void main(String[] args)
throws IOException { //通过ServerSocket对象 创建接收端套接字 ServerSocket serverSocket=null;
//套接字 Socket socket=null; //字节输入流 InputStream in=null; //默认参数定义端口号 发送方依据这个端口号发送
serverSocket=new ServerSocket(9000); socket = serverSocket.accept(); //socket对象
获取输入流,拿到文件 in = socket.getInputStream(); //将发送者发送过来的 文件通过文件字节输出流 输出到指定路径下
FileOutputStream fos= new FileOutputStream(new File("F:/recevice.jpg")); int len
; byte[] bytes=new byte[1024*10]; while ((len=in.read(bytes))!=-1){ fos.write(
bytes,0,len); } //通知发送者接受完毕了 OutputStream outputStream = socket.getOutputStream(
); outputStream.write("我是文件接收者:我已成功接受".getBytes()); //接受结束后,关闭资源好习惯 这部分写的简单
//一般建议先进行一个非空判断再关闭 fos.close(); serverSocket.close(); socket.close(); in.close()
; } }
<>测试方法:

<>以上代码可直接粘贴测试

1、先运行接收者等待接受,

2、再运行发送者,

3、等待接收者向发送者响应: 我是文件接收者:我已成功接受;

4、接收者指定接受目录下、查看接收文件存在即为接收成功!

<>总结:

这个demo实现并不是很难,主要考验了我们对于io流的熟练程度

技术
©2019-2020 Toolsou All rights reserved,
盘点国产PC操作系统哪家强?机房收费系统之组合查询自定义注解的方式的使用场景:解决业务分发CRC与模二除法的部分理解2021 年了,为什么还有人怀念手机呼吸灯?HVV 2020 | HVV期间漏洞总结「三」PHP中字符串的处理【Java知识点详解 3】序列化与反序列化vue 路由跳转四种方式 (带参数)航拍:特斯拉上海工厂Model Y已经大量下线