先了解一下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流的熟练程度
到此这篇关于Java基于TCP协议socket网络编程的文件传送的实现的文章就介绍到这了,更多相关Java socket文件传送内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!